我有一个使用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编写此代码?
答案 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 ? :
但是您的最后一个条件仍然存在问题,应该返回什么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
}