gpt4 book ai didi

java - 如何匹配流元素但不存在则返回false?

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:48 26 4
gpt4 key购买 nike

我有一个流,想检查是否所有流都匹配过滤器。如果全部匹配,则返回 true

但是,如果流为空,我想返回 false

我该怎么做?

示例代码:

public boolean validate(Stream<Whatever> stream) {
// Problem: returns **true** if stream empty.
// How can **false** be returned if stream is empty?
return stream.allMatch(Whatever::someCheck);
}

最佳答案

你可以使用

public boolean validate(Stream<Whatever> stream) {
return stream.map(Whatever::someCheck).reduce(Boolean::logicalAnd).orElse(false);
}

表示意图。我们将每个元素映射到一个 boolean 值,表示它是否匹配并使用逻辑 and 运算减少所有元素,这将产生 true 当且仅当它们是 true。如果没有元素,reduce 将返回空的 Optional,我们使用 orElse(false) 将其映射到 false ,如预期的那样。

唯一的缺点是这是非短路的,即不会在第一个不匹配的元素处立即停止。

仍然支持短路的解决方案可能会更进化一些:

public boolean validate(Stream<Whatever> stream) {
boolean parallel = stream.isParallel();
Spliterator<Whatever> sp = stream.spliterator();
if(sp.getExactSizeIfKnown() == 0) return false;
Stream.Builder<Whatever> b = Stream.builder();
if(!sp.tryAdvance(b)) return false;
return Stream.concat(b.build(), StreamSupport.stream(sp, parallel))
.allMatch(Whatever::someCheck);
}

这是 Eugene’s answer 的变体,但它不会丢失特性或并行性,并且通常可能会更高效一些。

关于java - 如何匹配流元素但不存在则返回false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46075776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com