java - 按一个字段进行流式分组,然后合并所有其他字段

标签 java lambda java-8 java-stream

我在流分组方面遇到问题。

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));

属性:

  1. haul.getFishCount();(整数)
  2. haul.getFishWeight(); (BigDecimal)

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

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

我可以按种类分组并了解总重量吗?

最佳答案

如果我理解正确的话:

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)))));

但是你不能真正让它们同时起作用。

关于java - 按一个字段进行流式分组,然后合并所有其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45105784/

相关文章:

Java8 lambda 用于检查两个条件

.net - 是否可以在Elasticsearch路径中使用lambda表达式?

Java Streams - 嵌套流的映射方法无法按预期工作

java - 通用类型的流图

java - @Async 将 bean 范围从一个线程复制到另一个线程

java - 如何从 JSON 接收到的 BASE64 字符串在 ImageView 中设置图像

java - POI 为 Word docx 文件中的第一页启用不同的页眉/页脚

java - 方法不明确 - Java

java - 运行 Zeppelin 时无法识别的 VM 选项 'MaxPermSize=512m'

java - 为什么我传递给 Arrays.sort 的方法引用需要是静态的?