gpt4 book ai didi

lambda - 搜索不一致行为 java-8 流的示例?

转载 作者:行者123 更新时间:2023-12-02 05:20:38 26 4
gpt4 key购买 nike

在 java 8 文档 (doc order stream) 中,可以看到这一点:

if [a stream] is not ordered, repeated execution might produce different results.

我的问题很简单:有没有一种简单的方法可以在一个小单元测试中说明这个事实(也许使用 HashMap 或类似的东西)?

[编辑]整个引用在这里:

For sequential streams, the presence or absence of an encounter order does not affect performance, only determinism. If a stream is ordered, repeated execution of identical stream pipelines on an identical source will produce an identical result; if it is not ordered, repeated execution might produce different results.

因此,我的问题是关于严格顺序而不是并行执行。我所质疑的就是这个案例。

最佳答案

显而易见的答案是,每当您使用unordered时,您都应该得到不同的结果。例如使用这个:

int first = Arrays.asList(1, 2, 3, 4).stream()
.unordered()
.parallel()
.findFirst()
.get();
System.out.println(first);

应该产生一个总是1的结果。因为流是无序的,所以[1,2,3,4]之外的任何结果都是可能的。

在 java-8 中,情况并非如此,流管道不会考虑无序:

    @Override
public <P_IN> O evaluateParallel(PipelineHelper<T> helper,
Spliterator<P_IN> spliterator) {
return new FindTask<>(this, helper, spliterator).invoke();
}

但是 java-9 中的情况发生了变化:

    @Override
public <P_IN> O evaluateParallel(PipelineHelper<T> helper,
Spliterator<P_IN> spliterator) {
// This takes into account the upstream ops flags and the terminal
// op flags and therefore takes into account findFirst or findAny
boolean mustFindFirst = StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags());
return new FindTask<>(this, mustFindFirst, helper, spliterator).invoke();
}

因此在java-9下多次运行相同的代码将产生不同的结果。

有些操作已经是无序,例如Stream#generateStream#forEach

关于lambda - 搜索不一致行为 java-8 流的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44944973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com