代码之家  ›  专栏  ›  技术社区  ›  Margus

番石榴函数参数

  •  9
  • Margus  · 技术社区  · 14 年前

    下面的代码显然有效,但我不喜欢用元组包装项目,

        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));
    

    帮助会很有用的,泰。

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

    public interface T2Function<T> {
        T apply(T Val_1, T Val_2);
    }
    
    2 回复  |  直到 14 年前
        1
  •  15
  •   ColinD    14 年前

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

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

    Function 是一个单参数函数,不适合任何多参数函数。

    我做过的另一个实验是 ReduceFunction<F, T> 正好可以用来做这样的事情。用于 reduce fold 操作,看起来像:

    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>

        2
  •  3
  •   Community CDub    7 年前

    看起来你在追求一个相当于c#的 Func :在您的案例中专门使用相同类型的参数和返回值。

    还有两个问题有很好的答案。。

    正如其他一些答案所暗示的那样,您可能被困在两个范例(OO和functional)之间,语言设计可以说比良好实践更快地赶上了这一点。如果你想继续下去,你可以试试 functionaljava .

    Mixing object-oriented and functional programming 更有趣的讨论。