如何用Java Stream筛选Car对象并计算指定字段平均值
解决Java Stream计算Car对象length平均值的问题
我来帮你排查下代码里的问题,你现在的代码主要有两个关键错误导致无法得到预期输出:
问题分析
- 错误1:Stream类型不匹配:你直接在
Stream<Car>上调用average()方法,但这个方法只存在于数值流(比如IntStream、DoubleStream)中,普通对象流没有这个方法。你需要先把Car对象转换成对应的数值流,提取出length字段的值。 - 错误2:返回类型处理不当:
average()方法返回的是OptionalDouble类型(因为可能没有符合条件的元素,平均值不存在),不能直接赋值给int变量,必须处理这个可选类型的结果。
修正后的完整代码
import java.util.ArrayList; import java.util.OptionalDouble; public class Car { int size; int length; public Car(int s, int l) { size = s; length = l; } public int getSize() { return size; } public int getLength() { return length; } public static void main(String[] args) { ArrayList<Car> list = new ArrayList<>(); list.add(new Car(1, 5)); list.add(new Car(8, 6)); list.add(new Car(12, 9)); list.add(new Car(25, 12)); // 筛选符合size条件的Car,转换为length的数值流并计算平均值 OptionalDouble averageLength = list.stream() .filter(car -> car.getSize() > 10 && car.getSize() < 30) .mapToInt(Car::getLength) // 将Car对象流转换为int类型的length流 .average(); // 计算平均值,返回OptionalDouble // 处理OptionalDouble结果,避免无匹配元素的情况 if (averageLength.isPresent()) { System.out.println("符合条件的Car的length平均值为: " + averageLength.getAsDouble()); } else { System.out.println("没有找到符合size范围的Car对象"); } } }
关键改动说明
mapToInt(Car::getLength):这一步把Stream<Car>转换成IntStream,提取每个符合条件的Car对象的length属性值,这样才能调用数值流特有的average()方法。- 处理
OptionalDouble:- 用
isPresent()判断是否存在有效的平均值(即是否有符合条件的Car) - 存在的话用
getAsDouble()取出平均值;如果没有符合条件的元素,会执行else分支的提示
- 用
运行这段代码后,你会得到输出:符合条件的Car的length平均值为: 10.5(因为符合条件的是size为12和25的两个Car,length分别是9和12,平均值是(9+12)/2=10.5)
内容的提问来源于stack exchange,提问作者Stop down voting for no reason
相关产品推荐
相关产品推荐

