Java stream的过滤器使用Predicate来允许或拒绝元素通过流。
多亏了.compose或.andThen,过滤器才能受到限制。
但是,如果根据某些标志,我想让它更宽松呢?
例如,我可能希望由用户对isAppleAllowed和isPearAllowed进行参数化设置。
.filter(f -> isAppleAllowed || isPearAllowed)的使用不起作用,因为如果其中任何一个为True,那么两个都是允许的。
我可以使用什么来更允许地扩展筛选器?
提前感谢您的帮助。
发布于 2018-04-15 06:37:56
你的例子没有任何意义。如果isAppleAllowed和isPearAllowed是boolean参数,正如它们的名称和您的文章所表明的那样,那么这两个参数单独或两者的任何布尔组合都不会构成您可以用来应用它们所描述的过滤的谓词。相反,您可能需要类似以下内容的内容
fruitStream.filter(f -> { return f.isApple() && isAppleAllowed; })过滤苹果,梨也是一样。要联合过滤,您可以使用
fruitStream.filter(f -> {
return (f.isApple() && isAppleAllowed)
|| (f.isPear() && isPearAllowed);
})或者,给定两个Predicate<Fruit>对象,比如applePredicate和pearPredicate,Predicate类提供了形成联合谓词的方法:
fruitStream.filter(applePredicate.or(pearPredicate))发布于 2018-04-15 06:28:21
我必须更改此答案,因为您正在寻找的内容与我最初的答案不同。像我之前建议的那样,使用两个单独的Stream#filter调用是没有意义的,因为在这种情况下,两个Predicate都需要相互依赖。
.filter(f -> (f.isApple() && isAppleAllowed) || (f.isPear() && isPearAllowed))但是,这样的操作应该是有效的,因为它在尝试过滤元素之前检查元素的属性。假设元素可以是苹果或梨,那么如果isAppleAllowed或isPearAllowed分别为true,则将对其进行过滤。
发布于 2018-04-15 06:29:55
您可以创建一个帮助器函数,它将为您返回Predicate。在此函数中,您可以同时使用这两个布尔函数。
https://stackoverflow.com/questions/49836735
复制相似问题