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

Java流分组依据和求和多个字段

锺离自明
2023-03-14

我有一张清单,傻瓜

class Foo {
    private String category;
    private int amount;
    private int price;

    ... constructor, getters & setters
}

我想按类别分组,然后合计金额和价格。

Map<Foo, List<Foo>> map = new HashMap<>();
Map<String, List<Foo>> map = fooList.stream().collect(groupingBy(Foo::getCategory()));

现在我只需要用一个保存汇总的金额和价格的Foo对象替换String键。这就是我被困住的地方。我好像找不到办法。

共有1个答案

孟永望
2023-03-14

有点难看,但应该管用:

list.stream().collect(Collectors.groupingBy(Foo::getCategory))
    .entrySet().stream()
    .collect(Collectors.toMap(x -> {
        int sumAmount = x.getValue().stream().mapToInt(Foo::getAmount).sum();
        int sumPrice= x.getValue().stream().mapToInt(Foo::getPrice).sum();
        return new Foo(x.getKey(), sumAmount, sumPrice);
    }, Map.Entry::getValue));
 类似资料:
  • 我可以同时使用和吗?

  • 问题内容: 我有一张标签表,想从列表中获得计数最高的标签。 样本数据如下所示 使用 让我得到正在寻找的完美数据。但是,我想对它进行组织,以使最高的标签数排在首位,并限制它仅向我发送前20个左右。 我试过了 而且我不断收到“组功能的无效使用-ErrNr 1111” 我究竟做错了什么? 我正在使用MySQL 4.1.25-Debian 问题答案: 在所有版本的MySQL中,只需在SELECT列表中为聚

  • 我不认为这叫做“分组”,但我需要做到以下几点:我有课 我有一些人: 父亲= 所以,每个人都可以是多个类别的一部分。我想得到以下映射: 现在,我可以手动迭代每个人,并将他们放到

  • 问题内容: 我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示: 该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。 例如,它可能返回: 当数据库中的记录是: 如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录? 问题答案: 一个简单的解决方案是将查询包裹与ORDER语句子选择 第一

  • 我正在使用DatabaseClient执行sql查询,我不知道如何通过以下方式进行分组:

  • 问题内容: 我需要在ES中使用3个字段进行汇总(分组)。 我可以在1个查询中执行此操作,还是需要对每列使用facet +迭代? 谢谢 问题答案: 您可以通过2种方式来做到这一点: 1)在一个方面中使用多个字段: 单个字段facet的示例: 单面结果中多个字段的示例: 2)使用多方面结果集: 参考链接:http : //www.elasticsearch.org/guide/reference/ap