如何在Java中使用lambdas创建Function2实例?

时间:2017-08-18 08:49:52

标签: lambda java-8

我正在尝试在Java中实现lambda Function2:

JavaPairRDD<String, Integer> reducedCounts = counts.reduceByKey(new Function2<Integer, Integer, Integer>() {
    @Override
    public Integer call(final Integer value0, final Integer value1) {
        return Integer.valueOf(value0.intValue() + value1.intValue());
    }
});

以上是一个示例,但如何将其更改为lamb8格式?我想定义为一个单独的函数

Function2<...> f2 = LAMBDA;
counts.reduceByKey(f2);

3 个答案:

答案 0 :(得分:3)

在这种情况下,您可以选择方法参考,这是最简单的选项:

Function2<Integer, Integer, Integer> f2 = Integer::sum;
counts.reduceByKey(f2)

等于:

Function2<Integer, Integer, Integer> f2 = (i1, i1) -> i1 + i2;
counts.reduceByKey(f2)

此外,这样的简化是可能的,因为你执行了大量不必要的装箱/拆箱以计算两个整数的总和。

答案 1 :(得分:1)

由于Function2是一个功能接口,您可以使用简单的lambda表达式实现它:

Function2<Integer,Integer,Integer> plus = (x,y)->Integer.valueOf(x.intValue()+y.intValue());

如果你的逻辑不仅仅是一个简单的表达式,你可以使用一个块:

Function2<Integer, Integer, Integer> plus = (x, y) -> {
   // do stuff
   return Integer.valueOf(x.intValue()+y.intValue());
};

如果添加简单的整数,您可以利用自动拆箱功能并将其更简单地写为:

Function2<Integer, Integer, Integer> plus = (x, y) -> x + y;

您还可以利用sum类中的Integer方法来使用方法参考:

Function2<Integer, Integer, Integer> plus = Integer::sum;

答案 2 :(得分:0)

这已经存在,它被称为BiFunction。但看起来您需要BiConsumer而不是Function,因为您的返回类型实际上是Void。例如:

BiFunction<Integer, String, Integer> bi = (x, y) -> {
        return x + y.length();
    };

    bi.apply(12, "test"); 

BiConsumer

BiConsumer<Integer, String> bi = (x, y) -> {
        System.out.println(x + y.length());
    };

    bi.accept(12, "test");

这样的事情:

counts.reduceByKey((x,y)-> Integer.valueOf(x.intValue() + y.intValue());