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

如何在groupby和sum一个属性后获取新的列表

笪德华
2023-03-14

我有一个settlement类的列表,它具有以下属性:

public class Settlement {
    private String contractNo;
    private String smartNo;
    private String dealTrackNo;
    private String buySellFlag;
    private String cashFlowType;
    private String location;
    private String leaseNo;
    private String leaseName;
    private double volume;
    private double price;
    private double settleAmount;

    // getters and setters
}

现在,我想按smartno(字符串)对settleAmount列表进行分组,并获得settleAmount的总和,该总和将成为每个smartno的新settleAmount

因为我使用的是Java 8,所以stream应该是应该走的路。

Groupby应该使用以下代码非常简单:

Map<String, List<Settlement>> map = list.stream()
              .collect(Collectors.groupingBy(Settlement::getSmartNo));
System.out.println(map.getValues());

如果我想通过SmartNo分组并在SettlementAmount上求和后获得一个新列表,该怎么办?这里的大多数例子只展示了如何打印出总和。我感兴趣的是如何获得聚合列表?

共有1个答案

李景天
2023-03-14

如果我正确理解了这个问题,那么您需要一个具有自定义合并的Tomap收集器,如下所示:

list.stream().collect(Collectors.toMap(
       Settlement::getSmartNo,
       Function.identity(),
       (s1, s2) -> s1.addAmount(s2.getSettleAmount())));

settlement类中使用帮助器方法:

Settlement addAmount(double addend) {
    this.settleAmount += addend;
    return this;
}
 类似资料:
  • 当我分组和求和时,我怎样才能绕过这个并保留C栏呢?

  • 我有以下数据框: 我想按列['Home'、'Away']分组,并将名称更改为Team。然后我喜欢将原点和awaypoint相加作为点的名称。 我怎么做?我尝试了不同的方法,使用下面的帖子:Link 但我无法得到我想要的格式。 非常感谢你的建议。 谢谢 泽普。

  • 问题内容: 尝试从计算中创建新列。在下面的代码中,我获得了每个日期的正确计算值(请参阅下面的组),但是当我尝试用它创建一个新列()时,我得到了NaN。因此,我正在尝试在数据框中使用Data3所有日期的总和创建一个新列,并将其应用于每个日期行。例如,2015-05-08位于2行中(总计为),在这个新列中,我希望两行中都具有55。 问题答案: 你要使用此方法将返回索引与df对齐的,然后可以将其添加为新

  • 问题内容: 我正在编写需要访问由Jackson配置定义的类的属性列表的代码。 例如,对于以下类: 我会得到,因为那是Jackson序列化时实际上考虑的属性。 我不认为编写完整的代码来查找getter / setter和检查Jackson注释不是要走的路,因为那样会重新实现Jackson。 如果我能够获得用于序列化的Jackson的句柄,是否可以获取a 或对象的属性列表? (尊重杰克逊的注释和配置)

  • 我正在尝试选择一些不在我的中的属性。这可能吗? 如何从中获取CatId和持久属性? 如果我将它们添加到组中,就像,那么我的结果就会混乱。 我可以使用获得其他属性,如,但这些属性不是计算值。 数据示例: 希望将结果按如下方式分组:

  • 我有一个包含对象的数组,它们是反应组件上的道具 我想抓住第一个物体的细节,因为它是 我可以这样做: 如何获取所有剩余的键和值,并将它们存储在组件状态中?