首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java过滤器,如何扩展过滤器?

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

Stack Overflow用户
提问于 2018-04-15 06:21:22
回答 3查看 586关注 0票数 3

Java stream的过滤器使用Predicate来允许或拒绝元素通过流。

多亏了.compose.andThen,过滤器才能受到限制。

但是,如果根据某些标志,我想让它更宽松呢?

例如,我可能希望由用户对isAppleAllowedisPearAllowed进行参数化设置。

.filter(f -> isAppleAllowed || isPearAllowed)的使用不起作用,因为如果其中任何一个为True,那么两个都是允许的。

我可以使用什么来更允许地扩展筛选器?

提前感谢您的帮助。

EN

回答 3

Stack Overflow用户

发布于 2018-04-15 06:37:56

你的例子没有任何意义。如果isAppleAllowedisPearAllowedboolean参数,正如它们的名称和您的文章所表明的那样,那么这两个参数单独或两者的任何布尔组合都不会构成您可以用来应用它们所描述的过滤的谓词。相反,您可能需要类似以下内容的内容

代码语言:javascript
复制
fruitStream.filter(f -> { return f.isApple() && isAppleAllowed; })

过滤苹果,梨也是一样。要联合过滤,您可以使用

代码语言:javascript
复制
fruitStream.filter(f -> {
    return (f.isApple() && isAppleAllowed)
            ||  (f.isPear() && isPearAllowed);
})

或者,给定两个Predicate<Fruit>对象,比如applePredicatepearPredicatePredicate类提供了形成联合谓词的方法:

代码语言:javascript
复制
fruitStream.filter(applePredicate.or(pearPredicate))
票数 2
EN

Stack Overflow用户

发布于 2018-04-15 06:28:21

我必须更改此答案,因为您正在寻找的内容与我最初的答案不同。像我之前建议的那样,使用两个单独的Stream#filter调用是没有意义的,因为在这种情况下,两个Predicate都需要相互依赖。

代码语言:javascript
复制
.filter(f -> (f.isApple() && isAppleAllowed) || (f.isPear() && isPearAllowed))

但是,这样的操作应该是有效的,因为它在尝试过滤元素之前检查元素的属性。假设元素可以是苹果或梨,那么如果isAppleAllowedisPearAllowed分别为true,则将对其进行过滤。

票数 1
EN

Stack Overflow用户

发布于 2018-04-15 06:29:55

您可以创建一个帮助器函数,它将为您返回Predicate。在此函数中,您可以同时使用这两个布尔函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49836735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档