list.stream() .collect(Collectors.collectingAndThen( Collectors.groupingBy(A::getId, Collector.of( () -> new A<>(null, 0d, null), (acc, a) -> { acc.setId(a.getId()); acc.setQuant(Double.sum(acc.getQuant(), a.getQuant())); acc.setType(a.getType()); }, (a1, a2) -> { a1.setQuant(Double.sum(a1.getQuant(), a2.getQuant())); return a1; }, a -> new B<>(a.getId(), new NewClass(a.getQuant(), a.getType()) ) )), Map::values )) // Set .forEach(System.out::println);