Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java过滤器,如何扩展过滤器?_Java_Lambda_Filter_Java Stream_Predicates - Fatal编程技术网

Java过滤器,如何扩展过滤器?

Java过滤器,如何扩展过滤器?,java,lambda,filter,java-stream,predicates,Java,Lambda,Filter,Java Stream,Predicates,Java streams的过滤器使用谓词s来允许或拒绝元素通过流 多亏了.compose或。然后可以限制过滤器 然而,如果我想根据一些旗帜让它更为自由呢 例如,我可能希望用户通过参数设置isAppleAllowed和isPearAllowed .filter(f->isAppleAllowed | | isPearAllowed)的使用不起作用,因为如果其中一个为真,则两个都是允许的 我可以使用什么来更自由地扩展筛选器 提前感谢您的帮助。我必须更改此答案,因为您要查找的内容与我最初的答案不同。正

Java streams的过滤器使用
谓词
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))