我正在尝试在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);
答案 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());