У меня есть список объектов, который мне нужно сгруппировать по 2 различным атрибутам, а затем суммировать значения атрибута, структура моего объекта выглядит примерно так:
private Long id1;
private Long id2;
private Double amountReserved;
private Double amountRequired;
//... more atributes and getters and setters
Итак, я тогдау меня есть список, например:
List<MyList> list = Arrays.asList(
list(1, A, 50, 200)
list(1, A, 50, 200)
list(1, B, 0, 100)
list(2, A, 10, 15)
list(2, A, 5, 15)
list(3, A, 0, 25));
То, что я пытаюсь достичь, - это новый список со следующей структурой:
list(1, A, 100, 100)
list(1, B, 0, 100)
list(2, A, 15, 0)
list(3, A, 0, 25)
Выяснение того, что я пытаюсь достичь:
- Группировка объектов по id1 и id2
- сумма
amountReserved
сгруппированного объекта - вычитание
amountRequired
из суммированных amountReserved
Что у меня есть на данный момент:
Это дает мне группировки, как я хотел
Map<Long, Map<String, List<MyList>>> map = null;
map = lista.stream().collect(Collectors.groupingBy(PreSeparacaoDto::getCodigoPedido,
Collectors.groupingBy(PreSeparacaoDto::getCodigoProduto)));
Это сумма по группам id1, ноЯ изо всех сил пытаюсь добавить в него вторую группировку, так как получаю синтаксические ошибки:
lista.stream()
.collect(Collectors.groupingBy(PreSeparacaoDto::getCodigoPedido,
Collectors.summingDouble(PreSeparacaoDto::getProdutoQuantidadeSeparada)))
.forEach((codigoPedido, ProdutoQuantidadeSeparada) -> System.out.println( codigoPedido + ": " + ProdutoQuantidadeSeparada ));
Моя проблема в том, что мне не удалось собрать их вместе (в соответствии с реквизитом 2), и я даже не был близок к достижению моегореквизит 3.
Я пытался использовать сокращение, как объяснено здесь , но, честно говоря, я был нне в состоянии повторить это с одной группировкой, сокращение возвращает ошибку, сообщающую, что мои параметры не соответствуют параметрам reducing
.Я искал другие варианты здесь на stackoverflow и других веб-сайтах, но безуспешно.
Может ли кто-нибудь мне помочь и подсказать, где мне не удается объединить сокращение с моей группой, или если это правильный путь, который ядолжно быть следующее.