Sta*_*lfi 4 java java-8 java-stream spliterator
订购
流可能有也可能没有已定义的遭遇顺序.流是否具有遭遇顺序取决于源和中间操作.某些流源(例如List或数组)本质上是有序的,而其他流(例如HashSet)则不是.某些中间操作(例如sorted())可能会在其他无序流上强制执行遭遇顺序,而其他中间操作可能会呈现无序的有序流,例如BaseStream.unordered().此外,一些终端操作可以忽略遭遇顺序,例如forEach().
HashSet?unordered将在并行计算的每个流上的中间操作?相遇的顺序不过是源头的顺序。例如ArrayList,在 中,元素按插入顺序排序,因此流过它只会按该顺序提供元素。
HashSet,HashMap也是无序的。如果您只对操作感兴趣collect,不关心订购,那么您无需担心。就会stream()好起来的。例如,如果你想计算总和,那么你会这样做:
List<Integer> list = Arrays.asList(1,2,3);
int sum = list.stream().collect(Collectors.summingInt(e -> e));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,元素流入流的顺序并不重要。
除了HashSet和HashMap集合视图之外,Stream.generate()还会生成无序流.
不用说,a生成的流Random也是无序的.此外,Stream.empty()不报告有遭遇订单,但这没有太大的后果......
如果您知道不需要Stream来维护遭遇顺序,那么使用unordered()-even 是一个很好的做法,如果它不能提高性能,就像当前实现中的大多数操作一样,它不会伤害并且会文件说你不喜欢的顺序.这不仅适用于并行流,一些操作,distinct()即使在顺序情况下也可能从无序中受益.
在某些情况下,在当前实施的情况下,选择正确的终端操作,findAny()而不是findFirst()意图更简洁并且对性能也有更大影响的文档.