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

标签 lambda java-8 hashmap java-stream

在 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/

相关文章:

c# - Lambda-列表中存在的列表中的用户ID

java - 为什么 Java 在使用 lambda 泛型时选择 Object 参数化类型?

java - 搜索 map 的最佳方式

java - 限制 Java HashMap 中 get 方法的对象类型

java - 如何在 hashmap 迭代器中使用 patter.matcher 比较用户定义的字符串对象

c# - 使用 subselect 和 groupby 的 LINQ 仅获取列表中每个项目的最新版本

java - 将 lambda 与 JdbcTemplate 查询方法一起使用显示模棱两可的错误

java - 新的 Java 8+ 分隔符(标点符号)——它们如何/在哪里使用?

java - 使用 LambdaMetafactory 在从其他类加载器获取的类实例上调用单参数方法

c# - 如何将 Lambda 表达式转换为 Sql?