[英]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.