您可以使用
public boolean validate(Stream<Whatever> stream) {
return stream.map(Whatever::someCheck).reduce(Boolean::logicalAnd).orElse(false);
}
它表达了意图。我们将每个元素映射到一个值,表示它是否匹配,并使用逻辑和运算减少所有元素,这将产生所有元素。 如果没有元素,将返回一个空,我们按预期映射到使用 。boolean
true
true
reduce
Optional
false
orElse(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答案的变体,但它不会失去特征或并行性,并且总体上可能更有效率。