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