簡體   English   中英

如何添加兩個Optional<Long> 在 Java 中

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM