OptionalDouble无stream()方法,如何以函数式方式修复Java流代码?
修复方案说明
错误根源
average()方法返回的是OptionalDouble类型,它没有stream()方法,直接链式调用.stream()必然报错。- 代码里的
.flatMap(a -> a)也是错误写法:LongStream.flatMap要求传入的函数返回LongStream,而非单个long值,这行在这里属于冗余且不符合语法的代码(如果只是想保留原元素,完全可以删掉)。
函数式风格的修复代码
不需要额外定义变量,直接通过OptionalDouble的内置方法链式处理即可:
return IntStream.of(1,2,3,4,5,6) .asLongStream() // 删掉错误的flatMap,若有拆分元素的需求可改为.flatMap(a -> LongStream.of(a)) .average() .map(Math::round) // 对平均值四舍五入,返回OptionalLong .mapToInt(rounded -> (int) rounded) // 将long转换为int,得到OptionalInt .orElse(-1); // 流为空无平均值时返回默认值-1
步骤解释
average()返回OptionalDouble,调用它的map方法可以安全处理内部数值:如果存在平均值,就执行Math.round()完成四舍五入,得到OptionalLong;如果流为空(无平均值),则直接跳过后续操作。- 用
mapToInt把四舍五入后的long转成int,得到OptionalInt。 - 最后用
orElse(-1)获取结果:如果有有效值就返回转换后的int,无值则返回-1,避免了直接调用getAsDouble()可能抛出的空值异常。
为什么不能用stream()?
OptionalDouble是用来处理单个可能为空的double值的容器类,并非Stream流对象,所以它没有提供stream()方法。要链式处理这类可选值,应该用Optional系列的专属方法(比如map、filter、orElse等),而非强行将它转为Stream。
内容的提问来源于stack exchange,提问作者nvn
相关产品推荐
相关产品推荐

