将Double转换为OptionalDouble的方法

时间:2017-03-16 20:12:52

标签: java java-8 sum optional

我有一个构建列表的新方法,我希望它将列表的总和作为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();
}

感谢。

3 个答案:

答案 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