2010-10-28 116 views
8

显然以下的工作,但我不喜欢包裹物品元组,番石榴函数参数

ImmutableMap<String, Function<Tuple2<Double>, Double>> op = new // 
    ImmutableMap.Builder<String, Function<Tuple2<Double>, Double>>() 
      .put("+", new Function<Tuple2<Double>, Double>() { 
       @Override public Double apply(Tuple2<Double> data) { 
        return data.Val_1 + data.Val_2; 
       } 
      }).build(); 
    System.out.println(op.get("+").apply(new Tuple2<Double>(3d, 4d))); 

我想写类似:

ImmutableMap<String, Function<Double[], Double>> op = new // 
    ImmutableMap.Builder<String, Function<Double[], Double>>() 
      .put("+", new Function<Double[], Double>() { 
       @Override 
       public Double apply(Double... data) { 
        return data[0] + data[1]; 
       } 
      }).build(); 
    System.out.println(op.get("+").apply(3d, 4d)); 

帮助将是最有用的,TY。

编辑:问题解决了,开始使用:

public interface T2Function<T> { 
    T apply(T Val_1, T Val_2); 
} 
+0

你可以通过从你的'Function.apply'中返回另一个'Function'来实现,然后将其应用到第二个参数。 'Function.apply的(a)。适用(B)'。 “内部”函数直接使用'a',并接收'b'作为参数。这可以扩展为'n'参数。这将模仿Haskell对函数的处理,但我不确定你在Javaland会从中获得什么。 – jpaugh 2015-12-11 15:03:35

回答

14

我想你会更好使用自己的接口,这样的事情:

public interface Operation { 
    double apply(double a, double b); 
} 

番石榴的Function是一个参数函数,并不适用于任何多参数。

我试验过的另一件事是一个ReduceFunction<F, T>碰巧可用于这样的事情。它是与reducefold操作使用和看起来像:

public interface ReduceFunction<F, T> { 
    T apply(T a, F b); // I can't decide on good names for the parameters =(
} 

这让你不喜欢

List<Double> doubles = ... 
Double sum = reduce(doubles, MathOps.add(), 0.0); 

东西的地方MathOps.add()ReduceFunction<Double, Double>,做了明显的事情。

+0

@CollinD:什么是缩小和折叠?我不明白。 – Emil 2010-10-28 05:16:34

+4

@Emil:它们是函数式编程构造,也就是高阶函数。一个'reduce'通常会通过一个提供的函数组合元素将一个列表减少为一个单一的值。 “折叠”类似于减少操作,除了它可以用初始值播种。提供给'fold'的函数将组合列表元素和种子值。 – gpampara 2010-10-28 06:26:01

+0

@gpampara:使用api完成这种功能性编程吗? – Emil 2010-10-28 06:52:38

3

它看起来像是在等同于c#的Func:专门针对您的情况使用相同类型的参数和返回值。

有有关这个好答案的其他两个问题..

由于一些其他的答案暗示,你可能会卡在中间的两个范式之间在这里(面向对象和功能),这是语言设计可以比优秀实践更快地赶上的东西。如果你想继续浑浊的水,你可以尝试functionaljava

请参阅Mixing object-oriented and functional programming进行更有趣的讨论。