【发布时间】:2020-06-17 21:48:00
【问题描述】:
我目前正在学习java.reduce(),最近在阅读一些材料和浏览视频时遇到了一些事情。我知道有 3 种方法可以使用它,但是,我在使 3 参数之一工作时遇到问题。我希望有人能更好地解释它发生了什么,以及为什么我没有得到我例外的结果(一组 MagicNumber 对象的平均值)。这是我到目前为止的一个例子:
一个对象,我们称之为 MagicNumber.java
public class MagicNumber{
Random randomValueGenerator = new Random();
int number;
public MagicNumber(){
this.number = randomValueGenerator.nextInt();
}
}
包含幻数的随机流
public static Stream<MagicNumber> getNStream(){
List<MagicNumber> magic = new ArrayList<MagicNumber>();
for(int i = 0; i < 100; i++){
magic.add(new MagicNumber());
}
return magic.stream();
}
返回平均幻数的函数
// This only returns the sum of the magic numbers and not the average
public static double average(){
Stream<MagicNumbers> magicNumberStream = getNStream();
return magicNumberStream.reduce(
0.0, // initial value
(a,b) -> a + (double)b.number,
(a,b) -> (a + b)/100
)
}
正如评论所暗示的,上面只返回所有幻数的总和。虽然我期待一些东西。所以,我不相信我完全理解 reduce 函数中第三个参数的用途。此外,当我使用 2 个参数编写如下内容时:
返回平均幻数的函数
// This throws an error due to the return type
public static double average(){
Stream<MagicNumbers> magicNumberStream = getNStream();
return magicNumberStream.reduce(
0.0, // initial value
(a,b) -> (double)(a.number + b.number)/100
)
}
我收到错误 Bad return type in lambda expression: double cannot be converted to MagicNumber。有人可以解释(A)为什么这两个average 函数没有按预期工作,以及(B)如何修改它们以获得我正在寻找的结果?非常感谢您的帮助!
【问题讨论】:
-
你从哪里得到这个例子的?
-
我编的...
标签: java lambda mapreduce java-stream reduce