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

Encounter order collections - best practice & example

Ordering

Streams may or may not have a defined encounter order. Whether or not a stream has an encounter order depends on the source and the intermediate operations. Certain stream sources (such as List or arrays) are intrinsically ordered, whereas others (such as HashSet) are not. Some intermediate operations, such as sorted(), may impose an encounter order on an otherwise unordered stream, and others may render an ordered stream unordered, such as BaseStream.unordered(). Further, some terminal operations may ignore encounter order, such as forEach().

  1. 是否有其他类型没有遇到顺序 属性 但 HashSet
  2. 如果我对保持现有顺序或任何排序不感兴趣,显式调用unordered中间是否被认为是最佳实践将并行计算的每个流上的操作?

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

  1. 除了HashSetHashMap也是无序的
  2. 如果您只对collect操作感兴趣,不关心顺序,那么您无需担心。只需 stream() 即可。 例如。如果你想计算总和,那么你可以这样做:

    List<Integer> list = Arrays.asList(1,2,3);
    int sum = list.stream().collect(Collectors.summingInt(e -> e));
    

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

除了HashSetHashMap的集合视图,Stream.generate()会生成一个无序流。

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

如果您知道不需要 Stream 来维护相遇顺序,那么使用 unordered() 是一个很好的做法——即使它不会提高性能,就像目前的实施,它不会造成伤害,并且会 记录 您不关心订单。这不仅适用于并行流,某些操作,如 distinct(),即使在顺序情况下也可能受益于无序性。

在某些情况下,选择正确的终端操作,例如 findAny() 而不是 findFirst() 的文档,其意图更简洁并且也会对性能产生更大的影响,鉴于当前的实施。

关于你的第二个问题。如果您不关心这些,unordered 提供帮助。我刚才也有同样的问题,

现在想想无序。当您有一个 List 并且将每个元素乘以 2 并将其收集回 List 时,您可以并行执行此操作。中间列表的每次合并都必须以在结果列表中保留顺序的方式发生。您可能已经计算了第 4 个和第一个中间结果,现在需要合并它们。如果你关心顺序,你不能直接合并它们,因为这显然会破坏顺序;因此您需要计算其他中间结果并以相同的顺序合并它们

您可能会想象这就像从左到右遍历 List;从索引零到最后一个。

另一方面,如果您不关心顺序,则此合并可以按 任何顺序发生 无论何时 ready.You 甚至可以以任何顺序读取任何元素,因为这是无关紧要的。

findFirstfindAny 在后台使用相同的想法。假设你有一个包含 8 个元素的列表,并行处理它并且只需要 return 第一个。您可能已经处理了最后 7 个元素 已经 ,但是因为您需要第一个,所以没关系 - 您仍然需要等待第一个处理。很明显为什么 findAny 更好......