Я столкнулся с ситуацией, которую я хотя бы обрабатывал с помощью Stream API, но я просто не могу найти правильное решение.Как выполнить операцию сокращения на некоторых участках потока
Дело в следующем: у меня есть поток элементов, отсортированных по полю идентификатора. Для этого идентификатора существует несколько элементов с одинаковым значением, и мне нужно дедуплицировать их на основе условий в других полях. Концептуально это можно рассматривать как операцию уменьшения на нескольких кусках потока, приводя к потоку того же типа.
На данный момент единственным решением, с которым я справляюсь, является сбор потока на основе общего идентификатора, чтобы получить что-то вроде Map<Id, List<Elem>>
, а затем использовать поток этой карты для применения моих правил дедупликации и продолжения. Проблема (и почему я не буду использовать это решение) заключается в том, что collect
- это операция терминала, повторная потоковая передача после нее означает, что я буду перебирать элементы по два раза.
UPDATE
Рассмотрим следующий класс:
public static class Item {
private final int _id;
private final double _price;
public Item(final int id, final double price) {
_id = id;
_price = price;
}
public int id() {
return _id;
}
public double price() {
return _price;
}
}
И следующий поток:
final Stream<Item> items = Stream.<Item>builder()
.add(new Item(1, 4))
.add(new Item(1, 6))
.add(new Item(1, 3))
.add(new Item(2, 5))
.add(new Item(2, 1))
.add(new Item(3, 5))
.build();
После требуемой операции, если правило дедупликации является «с самым высоким цена ", поток должен содержать только Item (1, 6), Item (2, 5) и Item (3, 5).
Если я делаю это настоятельно, я могу использовать свои предметы, пока они имеют один и тот же идентификатор, резервируя их во временной коллекции и дедуплицируя эту коллекцию, когда сталкиваются с элементом с другим идентификатором.
Если я использую коллекцию для первой группы элементов по идентификатору, я буду использовать все данные одновременно, прежде чем переходить к следующей операции, и мне нужно избегать этого.
Try поиска потока фильтр для дедупликации и собирают в конце. – LazerBanana
Небольшой фрагмент кода поможет. Потому что сейчас я не совсем уверен, чего вы хотите достичь. Выбросить некоторые элементы из списка, основанные на некоторых внутренних полях, легко с фильтрами, но я не понимаю, как здесь вводится идентификатор. – Timmeey
Какую окончательную форму вы хотите получить? – shmosel