我有一个构建列表的新方法,我希望它将列表的总和作为OptionalDouble值返回。
但是,当我使用Java 8计算总和值时,我总是将返回值作为Double。
如何转换
Double to OptionalDouble
以下是我的和计算代码:
private static OptionalDouble sumListValue() {
// Build list
List<Double> testList = new ArrayList<>();
testList.add(...);
...
...
return testList.stream().mapToDouble(value -> value).sum();
}
感谢。
答案 0 :(得分:6)
您可以使用列表的长度将结果包装到OptionalDouble
。
OptionalDouble optional = testList.isEmpty() ? OptionalDouble.empty()
: OptionalDouble.of(testList.stream().mapToDouble(d -> d).sum());
答案 1 :(得分:3)
更新:非常简单的解决方案
似乎解决方案实际上是微不足道的,并且更容易让人期待:
static OptionalDouble sum(Stream<Double> stream)
{
return stream.mapToDouble(el -> el.doubleValue()).reduce((a, b) -> a + b);
// which is thanks to auto-unboxing can be shortened as
// return stream.mapToDouble(el -> el).reduce((a, b) -> a + b);
// or you can re-write it using static methods from Double
// return stream.mapToDouble(Double::doubleValue).reduce(Double::sum);
}
与sum
不同,reduce
(带有一个参数的那个)在空流的情况下返回OptionalDouble.empty
!如果你暂时考虑一下,这实际上并不令人惊讶。
<小时/> 旧答案(糟糕的黑客)
我投票支持了Flown的解决方案,但是如果你真的需要工作Stream
,即isEmpty
不可用,你需要将OptionalDouble返回空列表,你有几个黑客如:
static OptionalDouble sum(Stream<Double> stream)
{
Optional<Double> sum = stream.map(el -> Optional.of(el))
.reduce(Optional.empty(), (acc, el) -> Optional.of(acc.orElse(0.0) + el.get()));
return sum.isPresent() ?
OptionalDouble.of(sum.get()) :
OptionalDouble.empty();
}
答案 2 :(得分:0)
//Double double = 12.3; Incorrect, compilation error , double is a //keyword, cannot be a identifier
double doubleVal = 12.3;
OptionalDouble optionalDouble = OptionalDouble.of(doubleVal);
参考javadoc here。