Java 如何将以下字符串流减少为布尔值

Java 如何将以下字符串流减少为布尔值,java,Java,我已将以下流写为: private static Set<Integer> validBinNumberLength = new HashSet<>(); boolean valid = binDataRequest.getAccountBinNumbers().stream().reduce(true, (subTotal, element) -> Boolean.logicalAnd(subTotal, validBi

我已将以下流写为:

private static Set<Integer> validBinNumberLength =  new HashSet<>();

boolean valid = binDataRequest.getAccountBinNumbers().stream().reduce(true, (subTotal, element) ->
                    Boolean.logicalAnd(subTotal, validBinNumberLength.contains(element.length())));
private static Set validBinNumberLength=new HashSet();
boolean valid=binDataRequest.getAccountBinNumbers().stream().reduce(true,(小计,元素)->
Boolean.logicalAnd(小计,validBinNumberLength.contains(element.length());
我想确保所有帐号的长度都在validNumberBinLength域内

我得到的错误是,小计被视为字符串而不是布尔值。我怎样才能解决这个问题


一旦值返回为false,流是否会停止计算?。如果不是,我如何在流中实现这个惰性评估。我这样做是因为我不想使用老式的循环。

reduce
采用
二进制操作
,这意味着reduce函数的两个参数必须相同,除非使用稍微复杂的变体,其中包括
组合器

但它有点简单,您可以映射并使用
allMatch

boolean valid = binDataRequest.getAccountBinNumbers().stream()
    .map(String::length)
    .allMatch(validBinNumberLength::contains);
提前退出时的快速注意事项:在使用
allMatch
功能的情况下,它被设计为在值为
false
时短路。在reduce的情况下,它无法知道reducer返回的任何值都是final,因此没有提前退出,必须对所有元素进行评估


编辑:@dnault建议将其缩短和清晰

为什么小计被视为字符串而不是布尔值?你能更详细地解释这段代码吗?什么是函数标识?@Fernando
代码的小计
是reducer函数使用的初始值和中间结果。因此,为了进行编译,它应该是一个布尔值,对吗?最初是如何指定类型的?也许我很笨,但我不得不盯着
allMatch(Function.identity())
看了一会儿,才意识到当所有流元素都
true
时,它返回true。你觉得这种替代形式更简单吗
.stream().map(String::length).allMatch(validBinNumberLength::contains)
@Fernando一旦元素为false,它很可能会停止。(尽管这将是一个实施细节,可以走一条路或另一条路)。请注意,reduce选项将更简单,并且肯定会贯穿所有元素)