【发布时间】:2021-08-02 00:24:17
【问题描述】:
我有一个计算平均成本的流,代码看起来像这样
private Double calculateAverageCost(List<Item> items) {
return items.stream()
.mapToDouble(item -> item.cost)
.filter(cost -> cost > 0) // Ignore zero cost items
.average()
. // Something here to convert an OptionalDouble to value or null
}
如果没有值(例如,当所有成本为零时),我需要返回值的方法或 null。我的问题是OptionalDouble 上没有orElseNull 方法来进行转换。我可以在另一个步骤中做到这一点,例如
private Double calculateAverageCost(List<Item> items) {
final OptionalDouble average = items.stream()
.mapToDouble(item -> item.cost)
.filter(cost -> cost > 0) // Ignore zero cost items
.average();
return average.isPresent() ? average.getAsDouble() : null;
}
我意识到这是一个“原始”流,我的方法返回装箱的 Double,但看起来这可能会有所帮助,类似于 (Optional.empty().orElseGet(null))。
我是否缺少原因或更好的解决方案?
【问题讨论】:
-
用
map代替mapToDouble怎么样? -
@AndyTurner 只有原始流特化有
average()。Stream<Double>没有。你可以通过减少来做到这一点,但它会更丑 -
为什么不简单地让方法返回一个
OptionalDouble?我的意思是……这正是引入选项的原因。它们在调用某些方法后表示可能缺少值。
标签: java java-stream optional