如何在java中添加两个Optional<Long>

bho*_*dra 2 java optional

Optional<Long>totalLanding= ....(get it from somewhere);
Optional<Long>totalSharing = ...(get it from somewhere);
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情不是在语法上而是在逻辑上

Optional<Long>total = totalLanding+totalSharing;
Run Code Online (Sandbox Code Playgroud)

这样,如果两者都为空,则总计应该为空,如果其中一个具有该值,则总计应该具有该值,如果它们都具有该值,那么它们应该被添加并存储在总计中

Era*_*ran 7

使用Streams 怎么样?

Optional<Long> total = Stream.of(totalLanding,totalSharing)
                             .filter(Optional::isPresent)
                             .map(Optional::get)
                             .reduce(Long::sum);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我会使用OptionalLong而不是Optional<Long>.

解决方案将是类似的:

OptionalLong total = Stream.of(totalLanding,totalSharing)
                           .filter(OptionalLong::isPresent)
                           .mapToLong(OptionalLong::getAsLong)
                           .reduce(Long::sum);
Run Code Online (Sandbox Code Playgroud)


kan*_*kan 5

Java 9 或更新版本:

Optional<Long>total = Stream.concat(
        totalLanding.stream(),
        totalSharing.stream())
    .reduce(Long::sum)
Run Code Online (Sandbox Code Playgroud)

Java 8 兼容变体:

Optional<Long>total = Stream.concat(
        totalLanding.map(Stream::of).orElseGet(Stream::empty),
        totalSharing.map(Stream::of).orElseGet(Stream::empty))
    .reduce(Long::sum)
Run Code Online (Sandbox Code Playgroud)

或者更好地将其提取.map(Stream::of).orElseGet(Stream::empty)为实用方法并重用。或这里的其他变体:如何将 Optional<T> 转换为 Stream<T>?