【问题标题】:Why no OptionalDouble orElseNull() or a better solution为什么没有 OptionalDouble orElseNull() 或更好的解决方案
【发布时间】: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&lt;Double&gt; 没有。你可以通过减少来做到这一点,但它会更丑
  • 为什么不简单地让方法返回一个OptionalDouble?我的意思是……这正是引入选项的原因。它们在调用某些方法后表示可能缺少值。

标签: java java-stream optional


【解决方案1】:

OptionalDouble 包含一个 primitive 双精度。如果你想要一个可选的包装双精度,你可以使用Optional&lt;Double&gt;。基元不能为空,所以orElseNull 没有意义。

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

【讨论】:

    【解决方案2】:

    如果您返回null 只是为了表明所有费用都是0(或列表为空),那么您可以改为返回Double.NaN。这将允许您的返回类型是原始的double。

    private double calculateAverageCost(List<Item> items) {
        return items.stream()
                    .mapToDouble(item -> item.cost)
                    .filter(cost -> cost > 0) // Ignore zero cost items
                    .average()
                    .orElse(Double.NaN);
    }
    
    double avg = calculateAverageCost(items);
    if(Double.isNaN(avg)) {
        System.out.println("All costs are zero");
    }
    

    否则,您可以只使用orElse(0d)。由于您仅过滤正成本,因此仅当所有成本均为 0(或列表为空)时,平均值才会为 0。因此,如果结果为 0,则肯定意味着不存在正成本。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2011-11-21
      • 2021-08-24
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多