当前位置: 首页 > 知识库问答 >
问题:

findAny orElse后过滤器

翁凯定
2023-03-14

我正在使用Stream filterfindAny.orElse,但它并没有像我预期的那样工作,所以我假设我不了解真正的工作原理。这是我的代码

return Stream.of(getObjectAttributeValue(product, matchCriteria.getFieldName()))
             .map(o -> isIngredientRestricted(matchCriteria, (List<String>) o))
             .filter(Boolean::valueOf)
             .findAny().orElse(isCommercialHierarchyInfoRestricted(product, matchCriteria));

基本上我所期望的是,如果第一个映射发出布尔false,那么它将被过滤,这样findAny将不会找到任何可选的,因此将调用orElse。但即使在过滤器中有true,也会调用isCommercialHierarchyInfoRestricted。

知道我做错了什么吗?

共有2个答案

元阳荣
2023-03-14

正如Tagir所解释的那样,在调用方法之前,使用orElse(表达式)总是会导致对表达式进行求值,并且必须使用orElseGet(()-

但是,这是对StreamAPI的不必要使用。如果您想评估单个项目,您不需要创建单元素流来事后调用findAny。您可以首先创建一个可选

return Optional.of(getObjectAttributeValue(product, matchCriteria.getFieldName()))
     .map(o -> isIngredientRestricted(matchCriteria, (List<String>)o))
     .filter(b -> b)
     .orElseGet(() -> isCommercialHierarchyInfoRestricted(product, matchCriteria));

然而,与等效的普通Java语言结构相比,即使这样也是不必要的复杂:

return isIngredientRestricted(matchCriteria,
           (List<String>)getObjectAttributeValue(product, matchCriteria.getFieldName()))
  ||  isCommercialHierarchyInfoRestricted(product, matchCriteria);

这完全相同,不需要额外的API或lambda表达式。如果第一个表达式的计算结果为true,则|运算符还保证第二个表达式不会得到计算结果。

上官高翰
2023-03-14

您实际上需要使用orElseGet

.findAny().orElseGet(() -> isCommercialHierarchyInfoRestricted(product, matchCriteria));

在Java中,参数总是在方法调用之前求值,即使它在方法内部是不必要的,因此您无法避免求值orElse。这就是为什么orElseGet存在的原因:它的参数是函数,而函数在不需要时根本不能执行。

 类似资料:
  • 我有JXTreeTable可以过滤。当我过滤关键字时,会设置一个新模型。对我来说没问题。 现在我想展开所有过滤结果。为此,我保存了找到匹配节点的位置。(它不可能是一片叶子。) 对于这些位置,我使用以下方法创建了一个树形图列表: 现在,我迭代这个列表并调用expandPath(在新模型设置之后),其中getTreePaths()是我用之前的方法创建的树路径列表。 但它没有效果,只有根被扩展,所有的孩

  • 我需要有关此问题的帮助: 查询显示所有参加COSC121、COSC126和MATH111三门课程的CIS或UT学生的学生ID、姓名和课程。按学生ID排序结果。提示:考虑使用自连接。 以下是表格: 学生学号学生姓名计划 成绩学生_ID课程_ID成绩 这是我目前的情况。 如果我将行course_id = “COSC126” 更改为 (course_id = “COSC121” 并且 course_id

  • 问题内容: 如何在$ lookup之后添加过滤器,或者有其他方法可以执行此操作? 我的数据收集测试是: 我选择ID 100并汇总孩子: 我回来了: 但我只希望与“值:1”匹配的子项 最后,我希望得到以下结果: 问题答案: 这里的问题实际上是关于一些不同的东西,根本不需要。但是,对于仅从“$lookup之后过滤”标题到达此处的任何人,这些都是适合您的技术: MongoDB 3.6-子管道 较早-$

  • 问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的

  • 问题内容: 我正在开发Spring Boot应用程序,并使用Spring Security来保护我的应用程序。我创建了一个自定义过滤器,我想在UsernamePasswordAuthenticationFilter之后添加它。我使用HttpSecurity.addFilterAfter方法来执行此操作。 但是,我的过滤器从未被调用。请您帮助我。码: MultiSessionCustomLMSFil

  • 过滤器是 控制器动作 执行之前或之后执行的对象。 例如访问控制过滤器可在动作执行之前来控制特殊终端用户是否有权限执行动作, 内容压缩过滤器可在动作执行之后发给终端用户之前压缩响应内容。 过滤器可包含预过滤(过滤逻辑在动作之前)或后过滤(过滤逻辑在动作之后), 也可同时包含两者。 使用过滤器 过滤器本质上是一类特殊的 行为, 所以使用过滤器和 使用行为一样。 可以在控制器类中覆盖它的 behavio