在谓词中添加两个可选项
我必须用 Java编写一个Predicate,我可以在其中查询 predicate 的输入以获取两个Optional<Integer>对象。我必须根据两个 Optionals 的组合值返回 true 或 false。除了检查isPresent()然后get()这些值并添加之外,还有什么更好的方法可以做到这一点。
// Here assuming the comparingValue and integer1 and integer2 are all initialised with values.
// The isGreaterOrEqual function has an implementation.
int comparingValue;
Optional<Integer> integer1;
Optional<Integer> integer2;
if (integer1.isPresent() && integer2.isPresent())
return isGreaterOrEqual(comparingValue, integer1.get() + integer2.get());
if (integer1.isPresent())
return isGreaterOrEqual(comparingValue, integer1.get());
else if (integer2.isPresent())
return isGreaterOrEqual(comparingValue, integer2.get());
else
return false;
回答
您可以将其缩短为:
if (integer1.isPresent() || integer2.isPresent()) {
return compare(comparingValue, integer1.orElse(0) + integer2.orElse(0));
} else {
return false;
}
更新,关于您对概括的评论。如果您想涵盖最一般的情况并且没有任何“默认值”(例如0)可以在比较之前与其他值“组合”(例如x + 0),那么您拥有的 IF-cascade 是最好的得到。您可以使用Optional的方法重写它并将其转换为单个表达式,但本质上它仍然是具有 4 种情况的相同 IF 级联:
return
optValue1.map(
// value1 is present
value1 -> optValue2.map(
// value2 is also present ==> combine and compare
value2 -> compare(comparingValue, combine(value1, value2))
).orElseGet(
// value2 is not present ==> use value1
() -> compare(comparingValue, value1)
)
).orElseGet(
// value1 is not present
optValue2.map(
// value2 is present ==> use value2
value2 -> compare(comparingValue, value2)
).orElse(
// value2 is also not present ==> return default result
false
)
);
“经典”的 IF 级联对我来说似乎更具可读性 🙂
- @GiorgiTsiklauri,我不想改变 OP 的原始行为。如果没有 `if`,如果两个值都不存在且 `comparingValue` 为零,则结果将为 `true`。