0

我想模拟以下界面:

interface MultiSideEffectFunction<T> {
    void action(T first, T second);
}

(这将使我不必引入新界面)

有没有首选的番石榴方法来做到这一点?

注意:我考虑过这样做

Function<Pair<T>, Void>

但是有两个问题使得创建新界面更可取:

  1. 必须定义一个名为 的类Pair<T>,它看起来很像Map.Entry<T, T>带有更合适的 getter 名称的 a(作为第二个问题:有这样的 Guava 类型吗?)。
  2. Void返回类型总是很痛苦 - 最好有一个真正的签名void
4

2 回答 2

5

番石榴贡献者在这里。

首选的 Guava 方法是编写自己的界面。

特别是,不要使用Function; Function仅应在函数没有副作用时使用。

Guava 故意缺少Pair类型;我们建议您在任何时候需要一对时,创建自己的类,将有用的名称附加到两个值,而不是完全没有信息的“第一”和“第二”。(原型示例是 GPS 坐标;一个名为LatLong的类比 . 提供的信息要多得多Pair<Double, Double>。)

于 2012-06-28T16:39:18.473 回答
3

Guava 团队毫不掩饰他们只提供基本的函数式习惯用法,并且他们对重新创建完整的函数式编程 API 不感兴趣。为此,您可以查看其他几个 API。并且其中一些 API 支持引发副作用的“函数式”对象,即使副作用与纯函数式编程模型相反(我说这很好,因为 Java永远不会成为真正的函数式语言,即使在 lambda 之后) .

但无论如何,作为一个示例 API,Jedi提供的Command类正是您正在寻找的。在Functional Java中,它们提供了Effect类,我认为这是同一件事。

顺便说一句,在您的示例中,您可能希望提供多个 Type Vars 而不仅仅是<T>,以便您的每种输入类型都可以彼此不同。

只是针对明显的错别字进行了编辑)

于 2012-06-28T18:01:27.043 回答