【java8】请问一个ArrayList使用stream的map后,会保证原有顺序吗?

如题

List users = xxxxxxx;

假设User里面有3个数据,“a”“b”“c”

我使用users.stream().map....................toList

后,请问顺序还是abc么

                //顺序不变
        List collect = users.stream().map(String::toUpperCase).collect(Collectors.toList());

                //顺序会变
                List collect = users.parallelStream().map(String::toUpperCase).collect(Collectors.toList());

有一个回答是错的,忍不住答一下。
是否有序和stream还是parallelStream无关。
流的lambda表达式中和顺序有关的只有Collector的特性中的Characteristics。
你这里用的toList,Collectors.toList()返回的收集器是IDENTITY_FINISH的,翻译过来就是只和ID有关
也就是说你的数据源id有序时,返回值一定有序。
你用的List,List类的底层是ArrayList,ArrayList的ID是固定有序的,所以你的数据流结果一定是有序的。
如果你的数据源是底层是Hash表之类的无序类,那么你的数据流就可能是无序的。

再推荐一个讲parallelStream的文章:https://blog.csdn.net/lijingjingchn/article/details/106872480

使用stream是顺序流 他是不会变化的除非你在后续操作中做了修改

对于有顺序的源数据,比如list,set,Stream操作之后仍然会按照顺序排(线性操作)。
如果是非固定顺序的数据源,则不保证其最后处理的顺序。
对于线性Streams,源的固定顺序对性能没有特别影响。
对于并行Streams,不强调顺序的话显然性能会更好。比如filter,distinct,groupingBy操作,非顺序操作的效率就更好,可参考博客
另外,如果数据本身是固定顺序的,但是开发者本身不在意是否按顺序处理,那么可以通过unordered()处理之后再操作,会提高某些有状态的并行操作和结束操作的效率。

顺序不变。可以运行此代码。
List users=Arrays.asList("x","b","c");
for(int i=0;i System.out.println(users.get(i));
}
List collect = users.stream().map(String::toUpperCase).collect(Collectors.toList());
for(int i=0;i<collect.size();i++){
System.out.println(collect.get(i));
}
结果为 x b c, X B C

使用users.stream()......顺序不会发生改变

ArrayList使用stream的map后,会保证原有顺序的,除非你添加了优先级或者插入数据

是和否的问题,还是建议你直接代码运行试下就确定了,这样有助于你的学习