如何将条件语句与此特定的lambda表达式组合?

时间:2019-04-17 09:34:09

标签: java if-statement lambda java-8 predicate

我有一个使用lambda表达式编写的Java方法,其中需要添加更多条件,并且禁止使用经典的if和else。这是我当前的代码,用于检查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和else编写的方式:

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;
    }
}

我该如何使用lambda编写此代码?

4 个答案:

答案 0 :(得分:2)

类似

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())
}

答案 1 :(得分:0)

类似这样的东西

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而不是==进行比较。

答案 2 :(得分:0)

我不知道您的业务领域,但我试图使该条件更具表现力,可读性和可维护性。我还会问客户为什么用lambda作为它,因为我认为没有理由在这里使用它们。 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);
}

答案 3 :(得分:0)

这对于ternary operator ? :

来说是一项完美的工作

但是您的最后一个条件仍然存在问题,应该返回什么truefalse?知道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  
}