遇到订单集合 - 最佳实践和示例

Sta*_*lfi 4 java java-8 java-stream spliterator

订购

流可能有也可能没有已定义的遭遇顺序.流是否具有遭遇顺序取决于源和中间操作.某些流源(例如List或数组)本质上是有序的,而其他流(例如HashSet)则不是.某些中间操作(例如sorted())可能会在其他无序流上强制执行遭遇顺序,而其他中间操作可能会呈现无序的有序流,例如BaseStream.unordered().此外,一些终端操作可以忽略遭遇顺序,例如forEach().

  1. 是否有其他类型没有遭遇订单属性但是HashSet
  2. 如果我没有考虑保持现有的顺序或任何类型的排序,它是否被认为是最佳实践,通过明确调用unordered将在并行计算的每个流上的中间操作?

Dar*_*hta 5

相遇的顺序不过是源头的顺序。例如ArrayList,在 中,元素按插入顺序排序,因此流过它只会按该顺序提供元素。

  1. 除了 之外HashSetHashMap也是无序的。
  2. 如果您只对操作感兴趣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)

    在这种情况下,元素流入流的顺序并不重要。


Hol*_*ger 5

除了HashSetHashMap集合视图之外,Stream.generate()还会生成无序流.

不用说,a生成的流Random也是无序的.此外,Stream.empty()不报告有遭遇订单,但这没有太大的后果......

如果您知道不需要Stream来维护遭遇顺序,那么使用unordered()-even 是一个很好的做法,如果它不能提高性能,就像当前实现中的大多数操作一样,它不会伤害并且会文件说你不喜欢的顺序.这不仅适用于并行流,一些操作,distinct()即使在顺序情况下也可能从无序中受益.

在某些情况下,在当前实施的情况下,选择正确的终端操作,findAny()而不是findFirst()意图更简洁并且对性能也有更大影响的文档.

  • `findAny()` 并不比 `findFirst()` 慢,而是*快*,不是在任何情况下,而是有些,仅仅是因为对实现的限制较少。这是有文档记录的,因此阅读文档足以了解可能是这种情况,但需要一点经验来知道*何时*以及一些关于幕后发生的事情的知识(不一定是阅读源代码)代码)来理解*为什么*会出现这种情况。多年来在 Stackoverflow 上回答有关该主题的问题也很有帮助,因为尝试解决这些难题将提高知识…… (2认同)