【问题标题】:Setting a value if not null within a java stream如果在 java 流中不为空,则设置一个值
【发布时间】:2020-06-11 10:23:45
【问题描述】:

当我的交易对手可以是 null 时,我如何使用 Java 8 处理以下代码中的 null 检查。 我只想设置counterParty,如果它有一个值,如果它为空则不设置。

 public static Iterable<? extends Trade> buildTrade (final List<Trade> trade) {
    return () -> trade.stream()
                .map(trade -> Trade.newBuilder()
                    .setType(trade.type())              
                    .setUnit(trade.unit())
                    .setCounterParty(trade.counterParty())                  
                    .build())
                .iterator();
    }

【问题讨论】:

  • Trade 类中覆盖setCounterParty() 方法
  • 构建器中counterParty 的默认值是多少?如果您将其设置为 null,它甚至会有所不同吗?

标签: java java-8 functional-programming java-stream


【解决方案1】:

您可以使用以下代码:

trade.stream()
            .map(trade -> {
                TradeBuilder tb = Trade.newBuilder()
                    .setType(trade.type())              
                    .setUnit(trade.unit());
                Optional.ofNullable(trade.counterParty())
                    .ifPresent(tb::setCounterParty);
                return tb.build();
             })
            .iterator();

或者没有Optional:

trade.stream()
            .map(trade -> {
                TradeBuilder tb = Trade.newBuilder()
                    .setType(trade.type())              
                    .setUnit(trade.unit());
                if(trade.counterParty() != null) tb.setCounterParty(trade.counterParty());
                return tb.build();
             })
            .iterator();

【讨论】:

  • 工作正常,但反对使用 Optional.ofNullable() 然后在同一个代码块中展开它,这里:stackoverflow.com/a/41632128/7512
  • @slim 感谢您的评论,我分享了替代版本而不使用Optional
【解决方案2】:

这方面的流方面与问题无关;让我们把它去掉:

 trade -> Trade.newBuilder()
    .setType(trade.type())              
    .setUnit(trade.unit())
    .setCounterParty(trade.counterParty())                  
    .build()

如果 counterParty 为空,您要求不要设置它。

一个非常简单的方法是修改构建器类的setCounterParty(),使其不执行任何操作并返回,如果参数为空。

TradeBuilder setCounterParty(CounterParty cp) {
   if(cp != null) {
      this.counterParty = cp;
   }
   return this;
}

您确实需要确保此行为与其他调用者的需求一致。

如果您的构建器是由某个框架(Lombok 等)动态生成的,您可能没有可以轻松进行此更改的代码 - 但大多数此类框架都有允许您控制此类事情的机制.

如果你不能修改构建器,你可以分解对它的调用,并围绕 与if 打一个电话:

 trade -> { 
    TradeBuilder b = Trade.newBuilder()
      .setType(trade.type())              
      .setUnit(trade.unit());
    if(trade.counterParty() != null) {
      b.setCounterParty(trade.counterParty());
    }
    return b.build()
 }

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 2021-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2015-03-22
    相关资源
    最近更新 更多