假设我有一个布尔值流,并且我正在编写的归约操作是||
(或者)。我能否以一种方式编写它,以便在以下情况下放弃至少某些元素的评估:true
遇到的值是?
我正在寻找一定程度的优化(也许如果它是并行流),不一定是完全优化,尽管后者会很棒。
我怀疑你想要这种类型的构造。
// stop when any element evaluates to true
boolean any = stream.anyMatch(t -> t);
你可以用 peek 检查一下
Stream.of(1, 2, 3, 4).peek(System.out::println).anyMatch(i -> i == 2);
prints
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
确切的数字各不相同。
作为参考管道,anyMatch
calls
@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);
}
您可以在其中开始查看短路代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)