Сначала необходимо объединить экземпляров, которые имеют одинаковые travellerId
и routeId
, суммируя их атрибуты came
и gone
. Для этого у вас может быть следующий служебный метод в некотором вспомогательном классе TravellersUtility
:
public final class TravellersUtility {
private TravellersUtility() { }
public static Travellers merge(Travellers left, Travellers right) {
Travellers t = new Travellers();
t.setRouteId(left.getRouteId());
t.setTravellerId(left.getTravellerId());
t.setCame(left.getCame() + right.getCame());
t.setGone(left.getGone() + right.getGone());
return t;
}
}
Затем вы можете использовать вышеописанный метод, чтобы уменьшить ваш List<Travellers>
, используя Collectors.toMap
:
Map<List<Object>, Travellers> grouped = travellers.stream()
.collect(Collectors.toMap(
t -> Arrays.asList(t.getTravellerId(), t.getRouteId()),
Function.identity(),
TravellersUtility::merge));
Этот группирует Travellers
экземпляров по паре (travellerId, routeId)
и объединяет их при любом столкновении, суммируя их поля came
и gone
.
Теперь мы готовы удалить Travellers
экземпляров из значений карты, которые не завершили поездку туда и обратно:
grouped.values().removeIf(t -> t.getCame() > 0 && t.getGone() > 0);
Чтобы удалить такие экземпляры, мы используем метод Collection.removeIf
. Если вы в порядке с Collection<Travellers>
, все готово. Если вам нужен List<Travellers>
, просто выполните:
List<Travellers> result = new ArrayList<>(grouped.values());