Java 如何使用streams/lambdas重构此方法?

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();

我想使用Streams和Lambda。 但是我如何用它重写我当前的方法呢

 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.