我在分组流时遇到麻烦。

List<FAR> listFar = farList.stream().filter(f -> !f.getStatus().equals(ENUM.STATUS.DELETED))
            .collect(Collectors.toList());
List<HAUL> haulList = listFar.stream().map(f -> f.getHaul()).flatMap(f -> f.stream())
            .collect(Collectors.toList());

它按种类分组,一切都很好,但是HAUL还有另一个属性。
Map<Specie, List<HAUL>> collect = haulList.stream().collect(Collectors.groupingBy(HAUL::getSpecie));

属性:
  • haul.getFishCount();(整数)
  • haul.getFishWeight();(BigDecimal)

  • 是否可以按HAUL::getSpecie(按Specie)分组,而且还可以将这两个额外的字段“合并”在一起,所以我总计了?

    例如:我有3个HAUL元素,其中鱼类A的重量为50/30/10 kg。

    我可以按种类分组并具有总重量吗?

    最佳答案

    如果我正确理解:

    haulsList
          .stream()
          .collect(Collectors.groupingBy(HAUL::getSpecie,
                  Collectors.collectingAndThen(Collectors.toList(),
                      list -> {
                         int left = list.stream().mapToInt(HAUL::getFishCount).sum();
                         BigDecimal right = list.stream().map(HAUL::getFishWeight).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
                        return new AbstractMap.SimpleEntry<>(left, right);
                      })));
    

    有一种形式可以做:
    .stream()
    .collect(Collectors.groupingBy(HAUL::getSpecie,
                  Collectors.summingInt(HAUL::getFishCount)));
    

    要么
     .stream()
     .collect(Collectors.groupingBy(HAUL::getSpecie,
                 Collectors.mapping(HAUL::getFishWeight, Collectors.reducing((x, y) -> x.add(y)))));
    

    但是您不能真正使它们同时行动。

    09-05 08:40