当前位置:  开发笔记 > 编程语言 > 正文

将Java 8 lambda谓词与逻辑运算符组合在一起

如何解决《将Java8lambda谓词与逻辑运算符组合在一起》经验,为你挑选了2个好方法。

我有一个Stream stream,而SomeClass具有布尔方法isFoo()isBar().

我想,以检查数据流中的所有元素同时拥有isFoo()isBar()等于true.我可以通过SomeClass:isFooSomeClass::isBarlambdas 单独检查这个条件.

但是我如何将这两个lambdas与像and/ 这样的逻辑运算符结合起来&&

一个明显的方法是写一个额外的lambda:

stream.allMatch(item -> item.isFoo() && item.isBar());

但是我想避免写一个额外的lambda.

另一种方式是投射到Predicate:

stream.allMatch(((Predicate) SomeClass::isFoo).and(SomeClass::isBar));

有没有更好的方法 - 没有演员表和明确的lambdas?



1> John Kugelma..:

如果有假设的Predicate.of方法,你可以写:

stream.allMatch(Predicate.of(SomeClass::isFoo).or(SomeClass::isBar));

它不存在,但您可以自己编写.

public final class Predicates {
    public static  Predicate of(Predicate predicate) {
        return predicate;
    }
}

也就是说,我个人会选择你的第一个选择.

stream.allMatch(item -> item.isFoo() && item.isBar());

:: 方法引用很好但有时你必须编写显式lambdas.



2> Eugene..:

这也许不能算作答案(请如果不这样做不起来投票吧),但我有点有同样的需要,咀嚼一些谓词在一起,我只是写了一个小程序来达到这个.

private static  Predicate andPredicates(Predicate... predicates) {
    return Arrays.stream(predicates).reduce(Predicate::and).orElse(x -> true);
}

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有