我有一个使用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写这个?
就像是
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())
}
这对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
}
像这样的东西
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
而不是==
进行比较。
我不了解您的业务领域,但我试图使条件更具表现力,可读性和可维护性。我也会问客户为什么要用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);
}