В этом контексте Collectors.reducing
поможет вам преобразовать два Transaction
объекта в конечный объект того же типа. В вашем существующем коде вы могли сделать для отображения на Result
тип, используя Collectors.mapping
и затем пытаясь уменьшить его.
Но сокращение без идентификатора обеспечивает и Optional
упакованное значение для возможного отсутствия. Следовательно, ваш код выглядел бы так:
Map<Integer, Map<String, Optional<Result>>> res = transactions.stream()
.collect(Collectors.groupingBy(Transaction::getYear,
Collectors.groupingBy(Transaction::getType,
Collectors.mapping(t -> new Result("YEAR_TYPE", t.getValue()),
Collectors.reducing((a, b) ->
new Result(a.getGroup(), a.getAmount() + b.getAmount()))))));
, благодаря Хольгеру , можно еще больше упростить это
… и вместо Collectors.mapping(func, Collectors.reducing(op))
вы можно использовать Collectors.reducing(id, func, op)
Вместо использования этого и комбинации Collectors.grouping
и Collectors.reducing
, преобразуйте logi c, чтобы использовать Collectors.toMap
как:
Map<Integer, Map<String, Result>> result = transactions.stream()
.collect(Collectors.groupingBy(Transaction::getYear,
Collectors.toMap(Transaction::getType,
t -> new Result("YEAR_TYPE", t.getValue()),
(a, b) -> new Result(a.getGroup(), a.getAmount() + b.getAmount()))));
Ответ будет завершен с последующим прочтением Java Потоки: замена groupingBy и сокращение до toMap .