将OptionalDouble转换为Optional <java.lang.Double>

000*_*000 15 java average optional java-8

我有一个构建列表的方法,我希望它将列表的平均值作为可选值返回.

但是,当我使用Java 8计算平均值时,我总是将返回值作为OptionalDouble.

我该如何转换?

OptionalDouble to Optional<Double>?
Run Code Online (Sandbox Code Playgroud)

以下是我的平均计算代码:

private static Optional<Double> averageListValue() {
     // Build list
     List<Double> testList = new ArrayList<>();
     testList.add(...);
     ...
     ...


     return testList.stream().mapToDouble(value -> value).average();
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mar*_*o13 7

我会采用这种方法:

private static Optional<Double> convert(OptionalDouble od)
{
    return od.isPresent() ? 
        Optional.of(od.getAsDouble()) : Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)


shm*_*sel 7

@Andremoniy 的答案略有不同是跳过DoubleStream并使用averagingDouble()收集器:

if (testList.isEmpty()) {
    return Optional.empty();
}
return Optional.of(testList.stream().collect(Collector.averagingDouble()));
Run Code Online (Sandbox Code Playgroud)

或者考虑 0 是否是空列表的有效返回值,并可能Optional完全跳过。


And*_*niy 5

顺便说一句,我找到了另一个解决方案,它具有最简单的形式。

我开始思考:什么时候平均的结果可以为空?只有当列表自身为空时,对吗?因此,如果我们确定该列表不为空,那么我们可以安全地执行以下操作getAsDouble()

return Optional.ofNullable(testList.isEmpty() ? null : 
        testList.stream().mapToDouble(v -> v).average().getAsDouble())
Run Code Online (Sandbox Code Playgroud)

(从性能的角度来看,这可能比创建额外的 lambda 包装器更有效,正如类似答案中所建议的那样。)

  • 想了想,还是特意把三元运算放在了`Optional.ofNullable`里面。这是更时尚的东西,虽然我同意它还有一个比较操作 (4认同)
  • 这是一个双重测试,首先是 `isEmpty()`,然后是 `ofNullable` 中的 `null` 测试。不需要第二个测试:`return testList.isEmpty()? Optional.empty(): Optional.of(testList.stream().mapToDouble(v -&gt; v).average().getAsDouble());` (3认同)

Cal*_*tor 0

我不知道是否存在一个简洁的解决方案,但这应该有效:

OptionalDouble optionalDouble = testList.stream().mapToDouble(value -> value).average();
return Optional.ofNullable(optionalDouble.isPresent() ? optionalDouble.getAsDouble() : null);
Run Code Online (Sandbox Code Playgroud)