Есть вероятно однострочник для Java 8, но я предпочитаю избегать его, если мне это нужно. Обратите внимание, что это решение предназначено исключительно для Java 8.
По сути, процесс, которому вы должны следовать:
- Разделите ваши элементы на соответствующие сегменты (по идентификатору пользователя)
- Соедините элементы вместе
- Возвращает новый список, содержащий отдельный элемент.
Вы не указываете, какой customLabel
выигрывает в целом, но вот подход, который объединяет его с последним.
Добавьте этот метод в Customs
:
public void combine(Customs another) {
this.userId = another.getUserId();
this.customLabel = another.getCustomLabel();
this.itemPrice = null == this.itemPrice ? another.getItemPrice() : this.itemPrice + another.getItemPrice();
this.weight = null == this.weight ? another.getWeight() : this.weight + another.getWeight();
}
Следующие строки кода разбивают описанные выше шаги. Я использую сборщик здесь, чтобы объединить элементы вместе на заключительном этапе. По мере продвижения я в основном добавляю элементы в другой список для окончательного разбора.
final Map<String, List<Customs>> groupedCustomsElements = customsList.stream()
.collect(Collectors.groupingBy(Customs::getUserId));
final List<Customs> combinedResult = new ArrayList<>();
for (String s : groupedCustomsElements.keySet()) {
combinedResult.add(groupedCustomsElements.get(s)
.stream()
.collect(Customs::new, Customs::combine, Customs::combine));
}
Более простым решением может быть создание собственного пользовательского списка, который расширяет ArrayList
и дополняет метод add
в соответствии с вашими потребностями.
class CustomCombiningList extends ArrayList<Customs> {
@Override
public boolean add(Customs e) {
int idx = indexOf(e);
if(idx != -1) {
add(idx, get(idx).combineAndReturn(e));
remove(idx + 1); // clean up unneeded object; worth a unit test
} else {
super.add(e);
}
return true;
}
}
Для этого потребуются два новых метода — combineAndReturn
, который фактически возвращает результат combine
, и определение equals()
для вашего элемента Customs
. Это может быть красивее для чтения, чем запутанная лямбда.
02.08.2015