Java 如何使用streams/lambdas重构此方法?
我想使用Streams和Lambda。 但是我如何用它重写我当前的方法呢Java 如何使用streams/lambdas重构此方法?,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我想使用Streams和Lambda。 但是我如何用它重写我当前的方法呢 public double calculate() { double result = 0.0; if (!mediumList.isEmpty()) { Iterator<Medium> it = mediumList.iterator();
public double calculate() {
double result = 0.0;
if (!mediumList.isEmpty()) {
Iterator<Medium> it = mediumList.iterator();
while (it.hasNext()) {
result= result+ it.next().getAge();
}
result = result / mediumList.size();
}
return result;
}
public双重计算(){
双结果=0.0;
如果(!mediumList.isEmpty()){
迭代器it=mediumList.Iterator();
while(it.hasNext()){
result=result+it.next().getAge();
}
结果=结果/mediumList.size();
}
返回结果;
}
假设Medium
age
是一个int
,您可以通过调用getAge
然后调用sum
映射流中的每个Medium
。像
public double calculate() {
return mediumList.stream().mapToInt(Medium::getAge).sum() /
(double) mediumList.size();
}
仅供参考,如果mediumList为空,则返回
0.0
:
return mediumList.stream()
.collect(Collectors.averagingDouble(Medium::getAge));
您可以使用IntStream.average()
您需要使用
mapToInt
将其设置为IntSTream,以便对其进行平均或求和。如果你只使用map
,你可以得到Stream
,但这没有sum
或average
函数。什么是Medium
,什么是mediumList
?@PatrickParker,你现在怎么知道Medium
是什么。。。关键是让信息丢失。不,不是我。很抱歉让你失望。虽然我可以中和事物,但除非我看到它的有用性,否则我还不足以提高投票率。回到正题。。。返回getAge的类型。。。如能在此展示Medium
的相关实现,我将不胜感激。当然,出于这个原因,投票否决了这个问题@空指针我想我们可以假设这段代码编译后,getAge()
返回一个int
(就像在前面的问题中一样)或double
它肯定不会返回String
或bigdecimic
,尽管我不是这里的投票人。撇开这一点不谈,为什么我们需要在这里输入mapToInt?请您解释一下,或者链接到任何其他解释它的帖子。@nullpointer谢谢您,在使用Java 8 3年后,我忘记了什么是值得解释的。出于好奇,你认为这比averagingDouble快得多吗?@PatrickParker在这里使用收集器似乎有些过火,但似乎average()
仍然使用collect
。)考虑到OP的原始代码,.orElse(0.0)代码>将重现相同的行为。但值得重新思考的是,NaN
,就像这个答案一样,是否更合适。这取决于上下文。注意:使用average()
可能比使用sum()
和除法更简单。
return mediumList.stream()
.mapToInt(Medium::getAge) // mapToInt makes it an IntStream of the ages
.average() // get the average of the ages.
.orElse(Double.NaN); // otherwise use Double.NaN if the list is empty.