[英]How to add two Optional<Long> in java
Optional<Long>totalLanding= ....(get it from somewhere);
Optional<Long>totalSharing = ...(get it from somewhere);
我想做这样的事情不是在语法上而是在逻辑上
Optional<Long>total = totalLanding+totalSharing;
这样,如果两者都为空,则总计应该为空,如果其中一个具有该值,则总计应该具有该值,如果它们都具有该值,那么它们应该被添加并存储在总计中
使用Stream
怎么样?
Optional<Long> total = Stream.of(totalLanding,totalSharing)
.filter(Optional::isPresent)
.map(Optional::get)
.reduce(Long::sum);
顺便说一句,我会使用OptionalLong
而不是Optional<Long>
。
解决方案将是类似的:
OptionalLong total = Stream.of(totalLanding,totalSharing)
.filter(OptionalLong::isPresent)
.mapToLong(OptionalLong::getAsLong)
.reduce(Long::sum);
Java 9 或更新版本:
Optional<Long>total = Stream.concat(
totalLanding.stream(),
totalSharing.stream())
.reduce(Long::sum)
Java 8 兼容变体:
Optional<Long>total = Stream.concat(
totalLanding.map(Stream::of).orElseGet(Stream::empty),
totalSharing.map(Stream::of).orElseGet(Stream::empty))
.reduce(Long::sum)
或者更好地提取.map(Stream::of).orElseGet(Stream::empty)
作为实用方法.map(Stream::of).orElseGet(Stream::empty)
用。 或这里的其他变体: 如何将 Optional<T> 转换为 Stream<T>?
这应该适用于 Java 8:
Optional<Long> total = totalLanding.map(x -> x + totalSharing.orElse(0L))
.map(Optional::of) // wrap it twice for the next line to find an Optional inside
.orElse(totalSharing);
怎么样
BigDecimal zero = BigDecimal.ZERO
Optional<Long> addition = Optional.of(totalLanding.orElse(zero).add(totalSharing.orElse(zero)));
我们可以这样做:
Optional<Long>result = Optional.of((totalLanding != null ? totalLanding.get() : 0L) + (totalSharing != null ? totalSharing.get() : 0L));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.