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

问题描述 投票:1回答:4

我有一个使用lambda表达式编写的java方法,我需要添加更多的条件,我被禁止使用经典的if和elses。这是我当前的代码,用于检查getInstrument是否具有正确的ENUM:

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

对于这段代码,我需要添加一个条件来检查i.getGroup()是否为null,然后继续检查枚举是否正确。我还需要添加一个条件,如果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;
    }
}

我怎么能用lambda写这个?

java if-statement lambda java-8 predicate
4个回答
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
投票

这对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  
}

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


0
投票

我不了解您的业务领域,但我试图使条件更具表现力,可读性和可维护性。我也会问客户为什么要用lambdas,因为我认为没有理由在这里使用它们。一个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);
}
© www.soinside.com 2019 - 2024. All rights reserved.