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 一个布尔值。
要解决这个问题。您可以先将所有内容映射到 boolean
s,然后用 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 为真。
所以我的情况是我有一个布尔求值器。本质上,它们都是自定义类型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>
toBoolean
.
我不确定我做错了什么。谁能给点建议?
减少 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 一个布尔值。
要解决这个问题。您可以先将所有内容映射到 boolean
s,然后用 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 为真。