java – 如何在Stream上短路减少?

前端之家收集整理的这篇文章主要介绍了java – 如何在Stream上短路减少?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个布尔值流,而我写的reduce操作是|| (要么).我可以写一个这样的方式,如果遇到一个真正的价值,评估至少一些元素是放弃的?

我正在寻找一些优化(也许如果它是一个并行流),不一定是完全优化,尽管后者将是令人敬畏.

解决方法

我怀疑你想要这种类型的结构.
// 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);
}

在那里你可以看到短路代码.

原文链接:https://www.f2er.com/java/124482.html

猜你在找的Java相关文章