我有以下代码:
@Test
public void testAverageFromArray() {
final Double[] dbls = { 1.1, 1.2, 1.3, 1.4, 1.5 };
final double av = Stream.of(dbls).mapToDouble(d -> d).average().getAsDouble();
assertEquals(1.3, av, 0);
}
问题: 是否可以替换 d - > d lambda还有其他一些语法?这似乎是不必要的。
*我不确定这个问题的标题 - 如果它没有标记,请编辑。
感谢
答案 0 :(得分:4)
lambda d -> d
并非不必要。会发生什么是您需要提供一个函数T -> double
。实际上d -> d
是一个函数Double -> double
,因为取消装箱是自动完成的(自Java 5开始)。
您始终可以使用方法参考.mapToDouble(Double::doubleValue)
替换它,以明确它为您正在处理的Double实例的双值取消装箱。
答案 1 :(得分:3)
在您的代码中,您要将Stream<Double>
转换为DoubleStream
。后者具有average()
无法提供的便捷方法Stream
,因为它是可以与任意类型一起使用的泛型类。
因此,为了将T
的任意类型Stream<T>
转换为double
的{{1}}元素类型,需要转换函数,即使它就像DoubleStream
一样简单,在利用你和编译器的事实时,与流实现不同,知道元素类型是d -> d
,可以隐式取消装箱。
请注意,无论如何,当需要转换功能时,方法Double
会停止方便,您也可以使用:
DoubleStream.average()
使用final double av = Stream.of(dbls).collect(Collectors.averagingDouble(d -> d));
功能,它变为:
import static
为了完整起见,您甚至可以在没有final double av = Stream.of(dbls).collect(averagingDouble(d -> d));
功能的情况下使用
d -> d
但是,当然,这不会增加可读性和简洁性。它是final double av = Stream.of(dbls).collect(DoubleSummaryStatistics::new,
DoubleSummaryStatistics::accept, DoubleSummaryStatistics::combine)
.getAverage();
收集器所做的明确形式,但在这种形式下我们可以摆脱summarizingDouble(…)
函数。