【问题标题】:Guava function arguments番石榴函数参数
【发布时间】:2010-10-28 00:22:33
【问题描述】:

以下显然可行,但我不喜欢将项目包装在元组中,

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

【问题讨论】:

  • 您可以通过从您的Function.apply 返回另一个Function 来做到这一点,然后将其应用于第二个参数。 Function.apply(a).apply(b)。 “内部”函数将直接使用a,并接收b 作为参数。这可以针对n 参数进行扩展。这将模仿 Haskell 对函数的处理,但我不确定你会在 Javaland 中从中获得什么。

标签: java guava


【解决方案1】:

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

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

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

我尝试过的另一件事是ReduceFunction&lt;F, T&gt;,它恰好可以用于这样的事情。它用于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&lt;Double, Double&gt;,它的作用显而易见。

【讨论】:

  • @CollinD:什么是 reduce 和 fold ?我不明白。
  • @Emil:它们是函数式编程结构,也就是高阶函数。 reduce 通常会通过提供的函数组合元素来将列表缩减为单个值。 fold 类似于 reduce 操作,不同之处在于它可以使用初始值作为种子。然后,提供给fold 的函数将组合列表元素和种子值。
  • @gpampara:这样的函数式编程是用 api 完成的吗?
  • @Emil:在 Java 世界中,是的。 Guava 为这些添加了一些基础,使其成为一个非常好的库。请记住,有现成的函数式编程语言支持这一点 - Scala、Lisp、Haskell 等。Java 中添加闭包将使 Java 中的高阶函数更简单,但看起来我们将不得不等待 JDK 8对于那些。
  • 如果你没有 lambdas - 即,你像我在当前项目中一样被困在 Java 7 上:( - 我会选择一个明确命名的接口,因为它比@更具可读性987654333@
【解决方案2】:

看起来您正在寻找与 c# 的 Func 等效的东西:专门针对您的情况使用相同类型的 args 和返回值。

关于这个还有另外两个问题有很好的答案..

正如其他一些答案所暗示的那样,您可能会被困在两种范式(OO 和函数式)之间,语言设计可以说比良好实践更快地赶上。如果你想继续混水,你可以试试functionaljava

更多有趣的讨论请参见Mixing object-oriented and functional programming

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多