我想模拟以下接口:
interface MultiSideEffectFunction<T> {
void action(T first, T second);
}
(这将使我不必引入新界面)
有没有首选的番石榴方法来做到这一点?
注意:我想过用
Function<Pair<T>, Void>
但是有两个问题使得创建新接口更可取:
- 必须定义一个名为
Pair<T>
的类,它看起来很像具有更合适的 getter 名称的Map.Entry<T, T>
(作为第二个问题:有这样的番石榴类型吗? Void
返回类型总是很痛苦 - 最好有一个真正的void
签名。
番石榴贡献者在这里。
首选的 Guava 方法是编写自己的界面。
特别是,不要使用Function
; Function
只应在函数没有副作用时使用。
番石榴故意缺少Pair
类型;我们建议,任何时候你需要一对,你创建自己的类,将有用的名称附加到两个值,而不是完全没有信息的"第一"和"第二"。 (典型的示例是 GPS 坐标;标题为 LatLong
的类比Pair<Double, Double>
提供的信息量大得多。
Guava团队毫不掩饰他们只提供基本的函数式习语,并且他们对重新创建完整的函数式编程API不感兴趣。 除此之外,您可以查看其他几个 API。 其中一些 API 支持副作用诱导的"函数式"对象,即使副作用与纯函数式编程模型相反(我说这很好,因为 Java 永远不会成为真正的函数式语言,即使在 lambda 之后)。
但无论如何,作为示例 API,Jedi 提供了您正在寻找的 Command
类。 在函数式Java中,它们提供了Effect
类,我认为这是一回事。
顺便说一句,在您的示例中,您可能希望提供多个 Type Var 而不仅仅是 <T>
,以便您的每个输入类型可以彼此不同。
(刚刚编辑了明显的错别字)