【问题标题】:How to add two Optional<Long> in java如何在 java 中添加两个 Optional<Long>
【发布时间】:2019-12-31 11:27:27
【问题描述】:
Optional<Long>totalLanding= ....(get it from somewhere);
Optional<Long>totalSharing = ...(get it from somewhere);

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

Optional<Long>total = totalLanding+totalSharing;

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

【问题讨论】:

    标签: java optional


    【解决方案1】:

    使用Streams 怎么样?

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

    顺便说一句,我会使用 OptionalLong 而不是 Optional&lt;Long&gt;

    解决方案类似:

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

    【讨论】:

    • 你忘记了 optional 也是一个流。看我的回答。
    • @kan 你的意思是Optional 有一个stream() 方法。 Optional 不是 Stream。并不是我忘记了,只是对 Java 8 之后添加的方法不太熟悉。
    • 同意,我的意思是逻辑上它也是一个流,可惜 Java 8 缺少它。似乎 Java 8 API 作者忘记了它;)
    【解决方案2】:

    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) 提取为实用方法并重用。或此处的其他变体:How to convert an Optional<T> into a Stream<T>?

    【讨论】:

      【解决方案3】:

      这应该适用于 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);
      

      【讨论】:

      • 在 Java 9 中可以简化为:first.map(x -&gt; x + second.orElse(0L)).or(() -&gt; second);
      • @AlexanderTerekhov 是的,谢谢。我应该说这有点冗长,只是为了用 Java 8 编译。
      【解决方案4】:

      怎么样

      BigDecimal zero = BigDecimal.ZERO
      
      Optional<Long> addition = Optional.of(totalLanding.orElse(zero).add(totalSharing.orElse(zero)));
      

      【讨论】:

      • 类似的东西也是我的想法,但如果两者都没有设置,它不会返回一个空的可选项。
      【解决方案5】:

      我们可以这样做:

      Optional<Long>result = Optional.of((totalLanding != null ? totalLanding.get() : 0L) + (totalSharing != null ? totalSharing.get() : 0L));
      

      【讨论】:

      • 你真的试过了吗?如果任何 Optionals 是 Optional.ofNullable(null) 的结果,这将导致 NullPointerException。
      • 也不适用于要求如果两者都为空,则总计应为空
      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      相关资源
      最近更新 更多