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)
谢谢.
我会采用这种方法:
private static Optional<Double> convert(OptionalDouble od)
{
return od.isPresent() ?
Optional.of(od.getAsDouble()) : Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)
@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
完全跳过。
顺便说一句,我找到了另一个解决方案,它具有最简单的形式。
我开始思考:什么时候平均的结果可以为空?只有当列表自身为空时,对吗?因此,如果我们确定该列表不为空,那么我们可以安全地执行以下操作getAsDouble()
:
return Optional.ofNullable(testList.isEmpty() ? null :
testList.stream().mapToDouble(v -> v).average().getAsDouble())
Run Code Online (Sandbox Code Playgroud)
(从性能的角度来看,这可能比创建额外的 lambda 包装器更有效,正如类似答案中所建议的那样。)
我不知道是否存在一个简洁的解决方案,但这应该有效:
OptionalDouble optionalDouble = testList.stream().mapToDouble(value -> value).average();
return Optional.ofNullable(optionalDouble.isPresent() ? optionalDouble.getAsDouble() : null);
Run Code Online (Sandbox Code Playgroud)