从Java8 lambda返回相同的对象

时间:2015-11-24 17:48:19

标签: lambda java-8

我有以下代码:

@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还有其他一些语法?这似乎是不必要的。

*我不确定这个问题的标题 - 如果它没有标记,请编辑。

感谢

2 个答案:

答案 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(…)函数。