我想在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)?
答案 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>
,IntUnaryOperator
,LongUnaryOperator
,DoubleUnaryOperator
。 Function<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());