您想知道的一切都可以在
java.util.streamJavaDoc中找到。
订购方式
流可能具有也可能没有定义的遇到顺序。
流是否具有遇到顺序取决于源和中间操作。某些流源(例如List或数组)是固有排序的,而其他流源(例如HashSet)则不是。某些中间操作(例如sorted())可能会向其他未排序的流强加一个遇到顺序,而其他一些操作可能会使已排序的流变得无序,例如baseStream.unordered()。此外,某些终端操作可能会忽略遇到顺序,例如forEach()。如果对流进行了排序,则大多数操作将被约束为按其遇到顺序对元素进行操作; 如果流的源是包含[1、2、3]的列表,则执行map(x-> x *2)的结果必须为[2、4、6]。但是,如果源没有定义的遇到顺序,则值[2、4、6]的任何排列都是有效的结果。
对于顺序流,是否存在相遇顺序不会影响性能,只会影响确定性。如果订购了一个流,则在相同的源上重复执行相同的流管道将产生相同的结果;如果未订购,重复执行可能会产生不同的结果。
对于并行流,放宽排序约束有时可以使执行效率更高。如果元素的顺序无关紧要,则可以更有效地实现某些聚合操作,例如过滤重复项(distinct())或分组的约简(Collectors.groupingBy())。类似地,本质上与遇到顺序相关的操作(例如limit())可能需要缓冲以确保正确的顺序,从而削弱了并行性的优势。如果流具有遇到顺序,但用户并不特别关心该遇到顺序,则使用unordered()对流进行明确排序可以提高某些状态操作或终端操作的并行性能。但是,大多数流管道,例如上面的“块权重之和”示例,



