假设我有一个布尔值流,而我写的reduce操作是|| (要么).我可以写一个这样的方式,如果遇到一个真正的价值,评估至少一些元素是放弃的?
@H_301_5@解决方法
我正在寻找一些优化(也许如果它是一个并行流),不一定是完全优化,尽管后者将是令人敬畏.
我怀疑你想要这种类型的结构.
// 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<? super P_OUT> predicate) { return evaluate(MatchOps.makeRef(predicate,MatchOps.MatchKind.ANY)); }
这叫做
public static <T> TerminalOp<T,Boolean> makeRef(Predicate<? super T> predicate,MatchKind matchKind) { Objects.requireNonNull(predicate); Objects.requireNonNull(matchKind); class MatchSink extends BooleanTerminalSink<T> { 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); }
在那里你可以看到短路代码.