番石榴函数参数

Mar*_*gus 9 java guava

以下显然有效,但我不喜欢在Tuple中包装项目,

    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)));
Run Code Online (Sandbox Code Playgroud)

我想写一些类似的东西:

    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));
Run Code Online (Sandbox Code Playgroud)

ty是最有用的帮助.

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

public interface T2Function<T> {
    T apply(T Val_1, T Val_2);
}
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 15

我认为你最好使用你自己的界面,如下所示:

public interface Operation {
  double apply(double a, double b);
}
Run Code Online (Sandbox Code Playgroud)

Guava 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 =(
}
Run Code Online (Sandbox Code Playgroud)

这可以让你做的事情

List<Double> doubles = ...
Double sum = reduce(doubles, MathOps.add(), 0.0);
Run Code Online (Sandbox Code Playgroud)

哪个MathOps.add()ReduceFunction<Double, Double>显而易见的事情.

  • @Emil:它们是函数式编程结构,也就是高阶函数.`reduce`通常通过提供的函数组合元素将列表减少为单个值.`fold`类似于reduce操作,除了它可以用初始值播种.然后,提供给`fold`的函数将组合列表元素和种子值. (4认同)
  • @Emil:在Java世界中,是的.Guava为这些添加了一些基础,使其成为一个非常好的库.请记住,有一些功能编程语言可以支持这一功能 - Scala,Lisp,Haskell等.添加Java的闭包将使Java中的高阶函数更简单,但看起来我们将不得不等待JDK 8对于那些. (3认同)