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

时间:2018-04-14 22:21:22

标签: java lambda filter java-stream predicates

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

感谢.compose.andThen,可以限制过滤器。

然而,如果我想根据一些旗帜让它更宽松呢?

例如,我可能希望用户参数设置isAppleAllowedisPearAllowed

使用.filter(f -> isAppleAllowed || isPearAllowed)不起作用,因为如果两者都是True,则两者都是允许的。

我可以使用什么来更宽容地扩展过滤器?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

你的例子没有意义。如果isAppleAllowedisPearAllowedboolean参数,正如他们的名字和散文似乎表明的那样,那么这两个参数或两者的任何布尔组合都不构成您可以用来应用的谓词过滤他们描述。你会想要一些

的内容
fruitStream.filter(f -> { return f.isApple() && isAppleAllowed; })

过滤苹果,类似梨。要联合过滤,您可以使用

fruitStream.filter(f -> {
    return (f.isApple() && isAppleAllowed)
            ||  (f.isPear() && isPearAllowed);
})

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

fruitStream.filter(applePredicate.or(pearPredicate))

答案 1 :(得分:1)

我不得不改变这个答案,因为你要找的东西与我最初回答的不同。正如我之前建议的那样,对Stream#filter使用两个单独的调用是没有意义的,因为在这种情况下Predicate两个.filter(f -> (f.isApple() && isAppleAllowed) || (f.isPear() && isPearAllowed)) 都需要相互依赖。

isAppleAllowed

这样的东西应该可以工作,因为它在尝试过滤之前检查元素的属性。假设元素可以是苹果或梨,那么如果isPearAllowedtrue分别是{ "_id": { "$oid": "5abcf1e8734d1d68b1b1cf46" }, "name": "Sample 2", }, { "_id": { "$oid": "5abcf20b734d1d68b1b1cf60" }, "name": "Sample 2", }, ,它将被过滤掉。

答案 2 :(得分:1)

您可以创建一个将为您返回app.alert('Hello World'); 的辅助函数。在此函数中,您可以使用两个布尔函数。