我有一个Stream
,而SomeClass
具有布尔方法isFoo()
和isBar()
.
我想,以检查数据流中的所有元素同时拥有isFoo()
和isBar()
等于true
.我可以通过SomeClass:isFoo
和SomeClass::isBar
lambdas 单独检查这个条件.
但是我如何将这两个lambdas与像and
/ 这样的逻辑运算符结合起来&&
?
一个明显的方法是写一个额外的lambda:
stream.allMatch(item -> item.isFoo() && item.isBar());
但是我想避免写一个额外的lambda.
另一种方式是投射到Predicate super SomeClass>
:
stream.allMatch(((Predicate super SomeClass>) SomeClass::isFoo).and(SomeClass::isBar));
有没有更好的方法 - 没有演员表和明确的lambdas?
如果有假设的Predicate.of
方法,你可以写:
stream.allMatch(Predicate.of(SomeClass::isFoo).or(SomeClass::isBar));
它不存在,但您可以自己编写.
public final class Predicates { public staticPredicate of(Predicate predicate) { return predicate; } }
也就是说,我个人会选择你的第一个选择.
stream.allMatch(item -> item.isFoo() && item.isBar());
::
方法引用很好但有时你必须编写显式lambdas.
这也许不能算作答案(请如果不这样做不起来投票吧),但我有点有同样的需要,咀嚼一些谓词在一起,我只是写了一个小程序来达到这个.
private staticPredicate andPredicates(Predicate ... predicates) { return Arrays.stream(predicates).reduce(Predicate::and).orElse(x -> true); }