当前位置: 首页 > 知识库问答 >
问题:

Java8流:按分组并在新对象中存储和,以及合并映射

伏星汉
2023-03-14

我有一个班级排,比如:

class Row {
   public Long id1;
   public String id2;
   public Long metric1;
   public Long metric2;

   public Stats getStats() {
      return new Stats(metric1, metric2);
   }
}

a类统计数据:

class Stats{
    public Long totalMetric1;
    public Long totalMetric2;

    public void addMetric1(Long metric1) {
       this.totalMetric1 = this.totalMetric1 + metric1;
    }

    public void addMetric2(Long metric2) {
       this.totalMetric2 = this.totalMetric2 + metric2;
    }
}

我有一个行列表

List<Row> rowList;

我需要把它转换成一个按id1和id2分组的映射,我需要度量数据以这种形式汇总成Stats对象

Map<Long, Map<String, Stats>>

我正在使用java stream生成这个,但仍停留在这一点上:

Map<Long, Map<String, List<Stats>>> map = stream.collect(
            Collectors.groupingBy(r->r.id1(), 
            Collectors.groupingBy(r->r.id2,
            Collectors.mapping(r->r.getStats(), Collectors.toList()))));

如何将列表转换为另一个对象,该对象包含该列表中所有对象的总和?

还有一种方法可以使用java stream将上述形式的两个输出映射合并为第三个输出映射吗?

例如:-

输入:行列表

<1,"ABC", 1, 2>
<1,"ABC", 2, 2>
<1,"XYZ", 1, 2>
<2,"ABC", 1, 2>
<2,"XYZ", 1, 2>
<3,"XYZ", 1, 0>
<3,"XYZ", 2, 1>
<3,"XYZ", 2, 3>

结果:地图按字段1、字段2分组,字段3和字段4相加

1 - ABC - 3,4
    XYZ - 1,2
2 - ABC - 1,2
    XYZ - 1,2
3 - XYZ - 5,4

共有1个答案

林威
2023-03-14

我的建议是以比嵌套集合更容易的方式来完成它。在Row类中,添加

public Pair<Long,String> getIds() {
   return new Pair<>(id1,id2);
}

在Stats类中,添加

public Stats merge(Stats other) {
    return new Stats(totalMetric1+other.totalMetric1, totalMetric2 + other.totalMetric2);
}

然后写下

      Map<Pair<Long, String>, Stats> stats = rowList.stream().
              collect(Collectors.toMap(Row::getIds,Row::getStats, (s1,s2) -> s1.merge(s2)));

如果你对番石榴不过敏(你也不应该过敏,至少对我来说,这是每个项目中都应该包含的一个不需要动脑筋的库),你可以用更优雅、可读性更强的语言编写它

      Table<Long, String, Stats> table = rowList.stream().
            collect(Tables.toTable(Row::getId1, Row::getId2, Row::getStats,(s1,s2) -> s1.merge(s2),HashBasedTable::create));

而不必使用Pair

 类似资料:
  • 本文向大家介绍Java中合并数组到新对象数组,包括了Java中合并数组到新对象数组的使用技巧和注意事项,需要的朋友参考一下 以下是在Java中,将数组合并为新对象数组的Java程序- 示例 输出结果 名为Demo的类包含“ concat_fun”,该类接受两个对象并返回连接的对象作为输出。在主字符串中,创建两个整数对象,第三个对象用于存储合并后的对象。相关消息显示在控制台上。

  • 问题内容: 我在伪操作环境中工作,我们在收到数据后制作新图像。有时,当输入新数据时,我们需要重新打开图像并更新该图像以创建合成,添加叠加等。除了添加到图像之外,还需要修改标题,图例等。 matplotlib中有内置的东西可以让我存储和重新加载matplotlib.pyplot对象以供以后使用吗?它需要保持对所有相关对象(包括图形,线条,图例等)的访问。也许咸菜是我想要的,但我对此表示怀疑。 问题答

  • 问题内容: 用JavaScript合并两个数组的正确方法是什么? 我有两个数组(例如): 我希望能够得到类似以下的结果: 在基于“ id”字段将两个数组连接在一起的地方,仅添加了额外的数据。 我试图用它来做,但是它只是将第二个数组中的值覆盖到第一个数组中 问题答案: 这应该可以解决问题: 假定a1中第二个对象的id应该为2而不是“ 2”

  • 我有一张这样的清单 其中Objecto是此类型的对象 //接球手和接球手 } 我想将列表合并成如下的哈希图 我可以使用java 8 lambda来实现它吗?或者通过任何其他方式? 非常感谢!

  • 我有List sample1=lists.newarrayList(BIGINTEGER1,BIGINTEGER2,BIGINTEGER3); 我必须创建一个新的列表sample2,其中还有一个值“bigInteger4”,以及sample1列表: 我怎么能那样做?

  • 我有一个Java类,它有20个属性及其相应的getter和setter。还有两个对象列表:和。 使用Java 8: 但是我必须在哪个地方指定属性呢?是否应该重写和方法?