如果要1
优先处理前100个,然后是后100个,依此类推,它既不是并行也不是并发,而是实际上是顺序的。这些部分子列表可以并行处理。一个PriotityQueue
或者SortedMap
是要走的路。
排序地图:
使用方法TreeSet
内部的实现Collectors.groupingBy
:
Map<Integer, List<User>> map = users.stream()
.collect(Collectors.groupingBy(
User::getPriority,
TreeMap::new,
Collectors.toList()));
地图按优先级(键)排序。
优先队列:
- Group by
User::getPriority
toMap<Integer, List<User>>
按优先级对子列表进行分组
PriorityQueue
按优先级添加到比较中
- 并行处理顺序轮询的列表
从分组开始:
Map<Integer, List<User>> map = users.stream().collect(Collectors.groupingBy(User::getPriority);
此时,地图将如下所示:
[User(firstName=C, lastName=C, someValue=0, priority=1)]
[User(firstName=A, lastName=A, someValue=0, priority=2)]
[User(firstName=B, lastName=B, someValue=0, priority=3), User(firstName=D, lastName=D, someValue=0, priority=3)]
PriorityQueue
从地图创建:
Queue<List<User>> queue = map.entrySet()
.stream()
.collect(
() -> new PriorityQueue<>(Comparator.comparingInt(list -> list.get(0).getPriority())),
(pq, entry) -> pq.add(entry.getValue()),
AbstractQueue::addAll);
遍历队列尊重优先级,并且子集可能会被并行处理,因为它们具有相同的优先级。
for (List<User> users : queue) {
users.stream().parallel()...
}