如何在Stream上短路减少?

假设我有一个布尔值流,我正在编写的reduce操作是|| (要么)。 我能否以一种方式编写它,以便在遇到true值时至少放弃对某些元素的评估?

我正在寻找一些优化(可能是它是一个并行流),不一定是完全优化,虽然后者会很棒。

我怀疑你想要这种类型的构造。

 // stop when any element evaluates to true boolean any = stream.anyMatch(t -> t); 

你可以看看这个

 Stream.of(1, 2, 3, 4).peek(System.out::println).anyMatch(i -> i == 2); 

版画

 1 2 

对于一个并行的例子

 AtomicInteger count = new AtomicInteger(); IntStream.range(0, 1000).parallel().peek(t -> count.incrementAndGet()).anyMatch(i -> i == 2); System.out.println("count: " + count); 

打印一个像

 count: 223 

具体数量各不相同。

对于referencePipeline, anyMatch调用

 @Override public final boolean anyMatch(Predicate predicate) { return evaluate(MatchOps.makeRef(predicate, MatchOps.MatchKind.ANY)); } 

这称之为

 public static  TerminalOp makeRef(Predicate predicate, MatchKind matchKind) { Objects.requireNonNull(predicate); Objects.requireNonNull(matchKind); class MatchSink extends BooleanTerminalSink { MatchSink() { super(matchKind); } @Override public void accept(T t) { if (!stop && predicate.test(t) == matchKind.stopOnPredicateMatches) { stop = true; value = matchKind.shortCircuitResult; } } } return new MatchOp<>(StreamShape.REFERENCE, matchKind, MatchSink::new); } 

在那里你可以开始看到短路代码。