Вы можете минимизировать распределение промежуточных объектов, например, всех Arrays.asList(...)
объектов, создав карту самостоятельно, вместо использования потоковой передачи.
Это зависит от того факта, что ваш NameGroup
является изменяемым.
Чтобы даже сделать код проще, давайте добавим два помощника к NameGroup
:
public static class NameGroup {
// fields here
public NameGroup(User user) {
this.firstName = user.getFirstName();
this.lastName = user.getLastName();
}
public void incrementCount() {
this.count++;
}
// other constructors, getters and setters here
}
Имея это на месте, вы можете реализовать логику следующим образом:
Map<User, NameGroup> map = new TreeMap<>(Comparator.comparing(User::getFirstName)
.thenComparing(User::getLastName));
users.stream().forEach(user -> map.computeIfAbsent(user, NameGroup::new).incrementCount());
List<NameGroup> names = new ArrayList<>(map.values());
Или, если вам не нужен список, последнюю строку можно упростить до:
Collection<NameGroup> names = map.values();