如何模拟多参数副作用函数

时间:2012-06-28 16:23:10

标签: java guava

我想模仿以下界面:

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

(这将使我免于必须引入新界面)

有一种首选的番石榴方法吗?

注意:我想过用

做这件事
Function<Pair<T>, Void>

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

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

2 个答案:

答案 0 :(得分:5)

番石榴贡献者。

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

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

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

答案 1 :(得分:3)

Guava团队对于他们只提供基本的功能习惯并且他们对重新创建完整的功能编程API不感兴趣这一事实毫不掩饰。你可以看看其他几个API。其中一些API支持副作用诱导“功能”对象,即使副作用与纯函数式编程模型相对立(我说这很好,因为Java 永远将成为一个真正的功能语言,即使是在lambdas之后。)

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

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

JUST EDITED 用于显示错别字)