Установка значения, если оно не равно нулю в потоке java - PullRequest
0 голосов
/ 27 февраля 2020

Как я могу обработать 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();
    }

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Вы можете использовать следующий код:

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();
0 голосов
/ 27 февраля 2020

Потоковый аспект этого не имеет отношения к вопросу; давайте удалим это:

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

Вы просите не устанавливать counterParty, если оно равно нулю.

Очень простой способ сделать это - изменить класс строителя setCounterParty() ничего не делать и вернуть, если параметр имеет значение null.

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

Вам необходимо убедиться, что это поведение соответствует потребностям других вызывающих абонентов.

Если ваш построитель работает динамически сгенерированный неким фреймворком (Lombok et c), у вас может не быть кода, в котором вы можете легко внести это изменение, - но большинство таких фреймворков имеют механизмы, позволяющие вам контролировать подобные вещи.

Если вы не можете изменить конструктор, вы можете прервать вызовы на него и окружить один вызов if:

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