Java 8身份映射lambda?

时间:2014-04-15 17:26:32

标签: java lambda java-8

我想在Java 8中使用聚合操作找到几个矩形的平均面积。

Rectangle[] rects = new Rectangle[]{
    new Rectangle(5, 10, 20, 30),
    new Rectangle(10, 20, 30, 40),
    new Rectangle(20, 30, 5, 15)
};

System.out.println("Average area: "
    + Arrays.asList(rects)
    .parallelStream()
    .map((RectangularShape r) -> (r.getWidth() * r.getHeight()))
    .collect(Collectors.averagingDouble(o -> o)));
// I don't like this "o -> o"
System.out.println("Expected: 625");

但是,我发现o -> o所需的averagingDouble有点愚蠢。是否有一个更直观的替代这个lambda(甚至某个股票身份lambda)?

3 个答案:

答案 0 :(得分:9)

不需要:

System.out.println("Average area: "
     + Arrays.asList(rects)
       .parallelStream()
       .mapToDouble((RectangularShape r) -> (r.getWidth() * r.getHeight()))
       .average();

(另外,您可能会发现Stream.of(rects).parallel())优于Arrays.asList(rects).parallelStream()。)

答案 1 :(得分:3)

identity()中有java.util.function.X个方法,其中X = Function<T,R>UnaryOperator<T>IntUnaryOperatorLongUnaryOperatorDoubleUnaryOperatorFunction<T,R>中的T使用DoubleUnaryOperator::identity。所以看起来o -> o应该可行,尽管o -> o输入的次数要少得多。 (然后,{{1}}看起来更像是一种表情的表情符号.......)

答案 2 :(得分:2)

除了来自@Louis的答案之外,您可能还想在area()类中添加Rectangle方法,然后将方法引用传递给mapToDouble()方法:

System.out.println("Average area: "
            + Arrays.asList(rects)
            .parallelStream()
            .mapToDouble(Rectangle::area)
            .average());