Если вы хотите обработать первые 100 единиц с приоритетом 1
, то последние 100 и т. Д., Они не являются ни параллельными, ни параллельными, а фактически последовательными. Эти частичные подсписки могут обрабатываться параллельно. A PriotityQueue
или SortedMap
являются способами go.
SortedMap:
Используйте реализацию TreeSet
внутри Collectors.groupingBy
метод:
Map<Integer, List<User>> map = users.stream()
.collect(Collectors.groupingBy(
User::getPriority,
TreeMap::new,
Collectors.toList()));
Карта отсортирована по приоритету (ключу).
PriorityQueue:
- Группировать по * От 1024 * до
Map<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()...
}