【问题标题】:Why stream average() method returns OptionalDouble instead of double?为什么流平均()方法返回 OptionalDouble 而不是 double?
【发布时间】:2018-11-28 17:31:34
【问题描述】:

今天当我使用流平均值编写代码时,我了解到流平均值返回 OptionalDouble 而不是 double。我知道为什么使用OptionalDouble。

当我们调用流平均时还可以返回什么以便我们需要 OptionalDouble?

一个例子将不胜感激。提前致谢。

我的代码如下:

OptionalDouble average = persons.stream()
            .mapToInt(person -> person.getAge())
            .average();
if(average.isPresent()) {
    System.out.println(average.getAsDouble());
}

这里的persons 是Person 类的ArrayList。

【问题讨论】:

  • 那么,对于流为空的情况,您的解决方案是什么?
  • 是的,我知道,我实际上不需要 DoubleStream。在我的情况下,年龄将永远是整数。
  • @Mukit09 实际上,您要达到的目标是这里的实际问题。只求平均值?如果流是空的怎么办?
  • double average = persons.stream().mapToDouble(person -> person.getAge()).average().orElse(0.0);,但是青峰已经回答了为什么。
  • @Mukit09 是的,确实可以返回 0.0。但那是错误的。 NaN 会是一个更好的选择(毕竟 sum/num = 0/0 = NaN),但他们选择的解决方案是最好的,因此用户可以决定要做什么。

标签: java java-stream optional


【解决方案1】:

OptionalDouble 被返回只是因为流可能是空的,这是一个真正让用户决定在 "no 中做什么的好方法value" 情况,即您可以使用orElse 提供替代值,通过ifPresent 执行另一个操作,通过orElseThrow 抛出异常等。

【讨论】:

  • 如果流为空,我认为可以返回 0.0。反正现在明白了。 :) 谢谢
  • @Mukit09 为什么“什么都没有”的平均值应该是0.0 那么我的问题是?显然,他们决定的方式是正确的(在我看来)——这确保了通过应用程序逻辑处理所有情况
  • 如果你想要 0.0 作为没有元素的平均值,只需使用 .orElse(0.0)。我同意@AKSW。
  • 如果你真的需要双精度,也可以调用 getAsDouble()。
  • 我只是很困惑为什么首先存在OptionalDouble; Optional<Double> 不是更好地利用泛型类型系统并制作更简洁的 API 吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多