Вы можете сохранить сортировку -> коллекцию в список -> итерацию списка значений рядом друг с другом, если вместо этого выполните следующее
- Создание всех
CallLog
объектов. - Объединить их по полю
phoneNumber
- объединять поля
billing
каждый раз
- Возвращать уже объединенные элементы
Это можно сделать с помощью Collectors.toMap (Function, Function, BinaryOperator) , где третий параметр - это функция слияния, которая определяет, как будут комбинироваться элементы с одинаковыми ключами:
Collection<CallLog> callLogs = Arrays.stream(S.split("\n"))
.map(CallLog::new)
.collect(Collectors.toMap( //a collector that will produce a map
CallLog::phoneNumber, //using phoneNumber as the key to group
x -> x, //the item itself as the value
(a, b) -> { //and a merge function that returns an object with combined billing
a.billing += b.billing;
return a;
}))
.values(); //just return the values from that map
В итоге у вас будет CallLog
предметов с уникальными phoneNumber
полями, чье поле billing
равно комбинации всех billing
с ранее дублированных phoneNumber
с.