前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8 | 如何使用Group By 聚合操作集合数据?

Java8 | 如何使用Group By 聚合操作集合数据?

作者头像
玖柒的小窝
发布2021-11-28 20:43:06
1K0
发布2021-11-28 20:43:06
举报
文章被收录于专栏:各类技术文章~各类技术文章~

一、开发问题

集合数据分组很多在实际开发过程中是相当常见,比如传给前端的产品数据按照类型进行分组。最常见的方式是遍历整个集合,然后通过判断类型构造存储不同类型的集合。那么有没有更好的办法,Java8 groupingBy能帮到我们。

同样地, 假如我们有一个类Product,如下面的代码所示。

代码语言:javascript
复制
@Getter
@Setter
@ToString
@Builder
class Product{
    private Long id;
    private String category;
    private String name;
    private int count;
}
复制代码

我们现在获取到了List<Product>格式的数据。

代码语言:javascript
复制
static List<Product> getList(){
    final List<Product> productList = new ArrayList<>(100);
    for(int i =1;i<=100;i++){
        productList.add(Product.builder()
            .id((long) i)
            .name("name"+i)
            .category("category"+i%9)
            .count(i)
            .build());
    }
    return productList;
}
复制代码

接下来我们对这个数据进行一些复杂的处理。

二、最简单的单列处理

按照category类型进行分组。

代码语言:javascript
复制
final Map<String, List<Product>> maps = productList.stream()
    .collect(Collectors.groupingBy(Product::getCategory));
复制代码

这里对于 Collectors.groupingBy的参数 Function<? super T, ? extends K> classifier的返回值作为Key 。

三、分组后统计指定列的总数

按照category类型进行分组,并且统计每个类型的count总数。

代码语言:javascript
复制
Map<String, Integer> maps = productList.stream()
        .collect(Collectors.groupingBy(Product::getCategory, summingInt(Product::getCount)));
复制代码

按照上面的代码就能得到从分组结果中得到总和。这上面是聚合操作,如果要做筛选操作,比如查看类型分组下数量最多的产品怎么做? 用maxBy(comparingInt(*))即可。

代码语言:javascript
复制
Map<String, Optional<Product>> maps = productList.stream()
        .collect(Collectors.groupingBy(Product::getCategory, maxBy(comparingInt(Product::getCount))));
复制代码

用这些JDK现有的方法,在内存中转化数据的格式,能极大的提高开发效率。

本文系转载,前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、开发问题
  • 二、最简单的单列处理
  • 三、分组后统计指定列的总数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com