Java过滤器,如何扩展过滤器?
Java streams的过滤器使用Java过滤器,如何扩展过滤器?,java,lambda,filter,java-stream,predicates,Java,Lambda,Filter,Java Stream,Predicates,Java streams的过滤器使用谓词s来允许或拒绝元素通过流 多亏了.compose或。然后可以限制过滤器 然而,如果我想根据一些旗帜让它更为自由呢 例如,我可能希望用户通过参数设置isAppleAllowed和isPearAllowed .filter(f->isAppleAllowed | | isPearAllowed)的使用不起作用,因为如果其中一个为真,则两个都是允许的 我可以使用什么来更自由地扩展筛选器 提前感谢您的帮助。我必须更改此答案,因为您要查找的内容与我最初的答案不同。正
谓词
s来允许或拒绝元素通过流
多亏了.compose
或。然后可以限制过滤器
然而,如果我想根据一些旗帜让它更为自由呢
例如,我可能希望用户通过参数设置isAppleAllowed
和isPearAllowed
.filter(f->isAppleAllowed | | isPearAllowed)
的使用不起作用,因为如果其中一个为真,则两个都是允许的
我可以使用什么来更自由地扩展筛选器
提前感谢您的帮助。我必须更改此答案,因为您要查找的内容与我最初的答案不同。正如我之前所建议的,使用两个单独的调用Stream#filter
,是没有意义的,因为在这种情况下,两个谓词都需要相互依赖
.filter(f -> (f.isApple() && isAppleAllowed) || (f.isPear() && isPearAllowed))
不过,类似的方法应该可以工作,因为它会在尝试过滤元素之前检查元素的属性。假设元素可以是苹果或梨,那么如果isAppleAllowed
或isPearAllowed
分别为true
,则将对其进行过滤。您可以创建一个帮助函数,该函数将为您返回谓词。在这个函数中,您可以同时使用两个布尔函数。您的示例没有意义。如果isAppleAllowed
和isPearAllowed
是boolean
参数,正如它们的名称和你的文章所表明的那样,那么这两个参数单独或两者的任何布尔组合都不构成一个谓词,你可以用来应用它们描述的过滤。相反,你会想要一些类似于
fruitStream.filter(f -> { return f.isApple() && isAppleAllowed; })
过滤苹果,类似的过滤梨。要联合过滤,可以使用
fruitStream.filter(f -> {
return (f.isApple() && isAppleAllowed)
|| (f.isPear() && isPearAllowed);
})
或者,给定两个谓词
对象,例如appleprodicate
和pearPredicate
,类谓词
提供了形成联合谓词的方法:
fruitStream.filter(applePredicate.or(pearPredicate))