Java findAny-orElse后过滤器

Java findAny-orElse后过滤器,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我正在使用流过滤器findAny.orElse,但它并没有像我预期的那样工作,所以我想我不了解它到底是如何工作的。 这是我的密码 return Stream.of(getObjectAttributeValue(product, matchCriteria.getFieldName())) .map(o -> isIngredientRestricted(matchCriteria, (List<String>) o)) .f

我正在使用流过滤器
findAny.orElse
,但它并没有像我预期的那样工作,所以我想我不了解它到底是如何工作的。 这是我的密码

return Stream.of(getObjectAttributeValue(product, matchCriteria.getFieldName()))
             .map(o -> isIngredientRestricted(matchCriteria, (List<String>) o))
             .filter(Boolean::valueOf)
             .findAny().orElse(isCommercialHierarchyInfoRestricted(product, matchCriteria));
return Stream.of(getObjectAttributeValue(product,matchCriteria.getFieldName()))
.map(o->IsingRedEnterRestricted(匹配条件,(列表)o))
.filter(布尔::valueOf)
.findAny().orElse(受商业层级限制(产品、匹配标准));
基本上,我所期望的是,如果第一个映射发出一个布尔值false,那么它将被过滤,这样findAny将不会找到任何可选的,因此将调用orElse。但即使在过滤器中有一个true,也会调用IsCommercialHierarchyInformestricted

知道我做错了什么吗?

您实际上需要使用:

在Java中,参数总是在方法调用之前求值,即使它在方法内部是不必要的,所以您不能避免求值
orElse
参数。这就是为什么
orElseGet
存在的原因:它的参数是函数,在没有必要的情况下,函数根本不能执行。

As,使用
orElse(expression)
总是导致在调用方法
orElse
之前对
表达式进行求值,并且必须使用
orElseGet(()->expression)
而不是延迟表达式的计算

但是,这是对
流的不必要使用。如果要计算单个项目,不需要创建单个元素流,只需在之后调用
findAny
。首先,您可以创建一个
可选的

return Optional.of(getObjectAttributeValue(product, matchCriteria.getFieldName()))
     .map(o -> isIngredientRestricted(matchCriteria, (List<String>)o))
     .filter(b -> b)
     .orElseGet(() -> isCommercialHierarchyInfoRestricted(product, matchCriteria));
return Optional.of(getObjectAttributeValue(product,matchCriteria.getFieldName()))
.map(o->IsingRedEnterRestricted(匹配条件,(列表)o))
.过滤器(b->b)
.OrelGet(()->是商业等级信息限制(产品、匹配标准));
然而,与等效的普通Java语言结构相比,这也是一个不必要的复杂问题:

return isIngredientRestricted(matchCriteria,
           (List<String>)getObjectAttributeValue(product, matchCriteria.getFieldName()))
  ||  isCommercialHierarchyInfoRestricted(product, matchCriteria);
返回是不受限制的(匹配条件,
(列表)getObjectAttributeValue(产品,matchCriteria.getFieldName())
||受商业等级限制(产品、匹配标准);

这完全相同,不需要额外的API或lambda表达式。如果调用第一个表达式的计算结果为
true

orElse
,或者调用了
iscommercialhierarchyinformestricted
,则
|
运算符还保证不会计算第二个表达式。map(…).filter(Boolean::valueOf)
看起来没有意义。为什么不首先调用
.filter(…)
,即
.filter(o->IsingRediredEntrestricted(matchCriteria,(List)o))
?@zeroflagL IsCommercialHierarchyInformalRestricted。也许这里的主要问题是,我不应该使用stream哦,我明白了。您希望将
boolean
结果作为总体结果。是的,有时我们需要更多地使用函数编程。我恢复之前的状态,不使用流。
return isIngredientRestricted(matchCriteria,
           (List<String>)getObjectAttributeValue(product, matchCriteria.getFieldName()))
  ||  isCommercialHierarchyInfoRestricted(product, matchCriteria);