Как мне объединить операторы условия с этим конкретным лямбда-выражением? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть Java-метод, написанный с использованием лямбда-выражений, в котором мне нужно добавить больше условий, и мне было запрещено использовать классические if и elses. Это мой текущий код, который проверяет, имеет ли getInstrument правильный ENUM:

public static Predicate<Deal> isDeal() {
  return  i ->
    i.getInstrument() == ENUM1
      || i.getInstrument() == ENUM2
      || i.getInstrument() == ENUM3;
}

К этому коду мне нужно добавить условие, которое проверяет, является ли i.getGroup() нулевым, и затем продолжать проверять правильность перечислений. Мне также нужно добавить условие, что, если i.getGroup() != null and i.getGroup() != "NODEAL" и i.getInstrument() не является ENUM2 или ENUM3, он возвращает i. Вот как я мог бы написать это с классическим if и elses:

public static Predicate<Deal> is Deal() {

    if ( i.getGroup() == null && i.getInstrument() == ENUM1
                || i.getInstrument() == ENUM2
                || i.getInstrument() == ENUM3) {
      return i;
    } else if ( i.getGroup() != null && i.getGroup() == "DEAL" && 
    i.getInstrument() != ENUM2 || i.getInstrument() != ENUM3) {
      return i;
    }
}

Как я могу написать это с помощью лямбды?

Ответы [ 4 ]

2 голосов
/ 17 апреля 2019

что-то вроде

Predicate<Deal> isDeal() {
        return deal -> deal.getGroup() == null 
                       && EnumSet.of(Instrument.ENUM1, 
                                     Instrument.ENUM2,
                                     Instrument.ENUM3)
                                 .contains(deal.getInstrument())
                ||
                "DEAL".equals(deal.getGroup()) 
                && !EnumSet.of(Instrument.ENUM2,
                                     Instrument.ENUM3)
                                 .contains(deal.getInstrument())
}
0 голосов
/ 17 апреля 2019

Это идеальная работа для ternary operator ? :

Но все еще есть проблема с вашим последним состоянием, что оно должно вернуть, true или false?Знание Predicate<T> подписи boolean test(T t);

public static Predicate<Deal> isDeal() {
    return  i-> i.getGroup() == null ? 
                    EnumSet.of(ENUM1, ENUM2, ENUM3).contains(i.getInstrument()) : 
                    !"DEAL".equals(i.getGroup()) ? 
                        !EnumSet.of(ENUM2, ENUM3).contains(i.getInstrument()) : 
                        false; // What do you put here? This is missing in your question  
}
0 голосов
/ 17 апреля 2019

Я не знаю вашу бизнес-область, но я пытался сделать условие более выразительным, читабельным и понятным. Я также спросил бы клиента , почему они хотят это с лямбдами, потому что я не вижу причины использовать их здесь. if-else оператор даст вам то же самое без накладных расходов.

public Predicate<Deal> isDeal() {
    return isGroupAbsent().or(isGroupPresent());
}

private Predicate<Deal> isGroupPresent() {
    Instrument i = i.getInstrument();
    return d -> "DEAL".equals(d.getGroup()) && i != ENUM2 && i != ENUM3;
}

private Predicate<Deal> isGroupAbsent() {
    Instrument i = i.getInstrument();
    return d -> d.getGroup() == null && (i == ENUM1 || i == ENUM2 || i == ENUM3);
}
0 голосов
/ 17 апреля 2019

Примерно так:

public static Predicate<Deal> isDeal() {
   return  i->
        (i.getGroup() == null 
        && (i.getInstrument() == ENUM1
            || i.getInstrument() == ENUM2
            || i.getInstrument() == ENUM3)
        )
        ||
        ( i.getGroup() != null 
          && i.getGroup() == "DEAL" 
          && i.getInstrument() != ENUM2 && i.getInstrument() != ENUM3);
}

PS: Имейте в виду, что вы должны сравнивать строку с equals, а не ==.

...