Java 流,无法从 Optional<BooleanExpression> 转换为 Boolean

Java streams, cannot convert from Optional<BooleanExpression> to Boolean

所以我的情况是我有一个布尔求值器。本质上,它们都是自定义类型BooleanExpression。每个值都有一个方法 .evaluate(context),它接受一个变量映射 context,并应用评估。始终评估 returns a Boolean.

我正在尝试专门使用 Java 流来输出此数据。到目前为止,我已经能够使用 Java Streams 将 .evaluate 应用于 List<BooleanExpression>:

列表中的每个 BooleanExpression
return expressions.stream().map(e -> e.evaluate(context)).collect(Collectors.toList());

它工作正常并且 return 类似于 [true, true, false]

我现在要做的是使用 stream().reduce 获取该列表中每个元素的合取。如果我有 [true, false, false] 的列表,我想以 false.

结尾

这是我目前的代码:

return expressions.stream().reduce((x, y) -> x.evaluate(context) && y.evaluate(context));

应该return一个Boolean。但是,它给了我一个错误:

Java streams: cannot convert from Optional<BooleanExpression> to Boolean.

我不确定我做错了什么。谁能给点建议?

减少 returns 一个可选的,因为可能什么都没有出来。

Optional<T> reduce(BinaryOperator<T> accumulator)

尝试return expressions.stream().reduce((x, y) -> x.evaluate(context) && y.evaluate(context)).get();如果你确定会产生一些东西或使用Optional运算符.map

The overload of reduce that you are using returns an Optional<BooleanExpression> 因为在空流的情况下,它可以 return Optional.empty() 来表示没有什么可减少。

此外,该重载应该占用 BinaryOperator<BooleanExpression>,您似乎没有给它。你给它一个BiFunction<BooleanExpression, BooleanExpression, Boolean>。您使用的 lambda 接受两个布尔表达式和 returns 一个布尔值。

要解决这个问题。您可以先将所有内容映射到 booleans,然后用 Boolean::logicalAnd 减少。如果流为空,您还需要将默认值指定为 return:

return expressions.stream().map(x -> x.evaluate(context))
                           .reduce(Boolean::logicalAnd)
                           .orElse(true); // value to return if stream is empty

或者,您可以使用接受 identity 元素的 the other overload of reduce,并传入连词 (true) 的标识:

return expressions.stream().map(x -> x.evaluate(context))
                           .reduce(true, Boolean::logicalAnd);

如果流为空,这将 return 为真。

另一种方法是使用 the third overload of reduce,它需要一个标识、一个 BiFunction 以及一个组合器:

return expressions.stream().reduce(
    true, 
    (x, y) -> x && y.evaluate(context),
    Boolean::logicalAnd);

如果流为空,这将 return 为真。