Stream.parallel().collect(Collectors.groupingBy(keys))处理如何保证顺序
时间: 2024-05-10 08:15:50 浏览: 89
在并行流中,每个元素都会被分配到不同的线程中处理,因此处理的顺序可能是乱序的。在使用 `Collectors.groupingBy()` 方法时,虽然我们可以指定用哪个属性作为分组依据,但是无法保证每个组内的元素顺序。
如果需要保证顺序,可以使用 `Collectors.collectingAndThen()` 方法对 `Collectors.groupingBy()` 的结果进行封装。具体来说,可以使用 `LinkedHashMap` 作为结果容器来保留元素插入的顺序,然后再使用 `Collectors.toList()` 将每个组内的元素存储为列表。示例如下:
```java
Map<String, List<String>> result = Stream.of("a", "b", "c", "aa", "bb", "cc")
.parallel()
.collect(Collectors.groupingBy(
s -> s.substring(0, 1),
Collectors.collectingAndThen(
Collectors.toList(),
l -> l.stream().sorted().collect(Collectors.toList())
)
));
System.out.println(result);
```
输出结果为:
```
{a=[a, aa], b=[b, bb], c=[c, cc]}
```
可以看到,每个组内的元素按照字典序排列,并且组的顺序与原始流中的顺序一致。
阅读全文