【问题标题】:Java stream map and collect - order of resulting containerJava 流映射和收集 - 结果容器的顺序
【发布时间】:2015-07-27 07:44:54
【问题描述】:
List<MyObject> myList = new ArrayList<>(); 
//populate myList here

List<String> nameList = myList.stream()
        .map(MyObject::getName)
        .collect(Collectors.toList());

在上面的代码中,我可以期望MyObjectnameList 中的名称顺序总是与myList 的顺序相同吗?

【问题讨论】:

    标签: java list java-8 java-stream


    【解决方案1】:

    是的,即使您使用并行流,只要您没有将其显式转换为unordered() 模式,您也可以期待这一点。

    顺序在顺序模式下永远不会改变,但在并行模式下可能会改变。流变得无序:

    • 如果您通过unordered() 调用显式将其变为无序模式
    • 如果流源报告它是无序的(例如,HashSet 流是无序的,因为顺序取决于实现,您不能依赖它)
    • 如果您正在使用无序终端操作(例如,forEach() 操作或收集到无序收集器,如 toSet()

    在您的情况下,这些条件都不满足,因此您的流是有序的。

    【讨论】:

    • 这不是真的。并行流一次执行一个或多个元素。因此 map() 将保留流顺序的相遇,而不是原始列表的顺序。 p.s 如果您使用 list.stream().parallel().map(i)... 会保留流顺序。
    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2017-08-14
    相关资源
    最近更新 更多