为什么没有 OptionalDouble orElseNull() 或更好的解决方案

Jam*_*udd 2 java optional java-stream

我有一个计算平均成本的流,代码看起来像这样

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
}
Run Code Online (Sandbox Code Playgroud)

我需要返回值或null没有值的方法(例如,当所有成本为零时)。我的问题是不存在orElseNull的方法OptionalDouble做转换。我可以在另一个步骤中完成,例如

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;
}
Run Code Online (Sandbox Code Playgroud)

我意识到这是一个“原始”流,我的方法返回盒装,Double但看起来这可能会有所帮助,类似于 ( Optional.empty().orElseGet(null))。

我缺少原因或更好的解决方案吗?

Mic*_*ael 13

OptionalDouble包含一个原始双精度。如果你想要一个可选的包裹双精度,你可以使用Optional<Double>. 原语不能为空,所以orElseNull没有意义。

至于如何在两者之间进行转换,这里已经有了答案:Convert OptionalDouble to Optional <java.lang.Double>。TL;DR 目前还没有好的、原生的方式来做到这一点。等待瓦尔哈拉