java中list集合对象按照某一个属性分组

文章展示了如何使用Java8的StreamAPI中的Collectors.groupingBy方法,结合Lambda表达式或方法引用,对对象列表按特定属性进行分组。示例中,首先对UseCase对象列表按sn属性分组,然后同样地,对Map列表按sn键的值进行分组,两者达到相同的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    这里的需求是分组,就是集合按照相同的属性来分组。一般默认的做法就是定义一个对象,然后利用java8流对象的分组方法来分组,在分组函数中,传入一个属性get方法。如下所示:

package com.xxx.map;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ListMapGroupByExample {
    public static void main(String[] args) {
        List<UseCase> list = new ArrayList<>();
        list.add(new UseCase(1,"test01"));
        list.add(new UseCase(1,"test02"));
        list.add(new UseCase(2,"test02"));
        list.add(new UseCase(3,"test03"));
        Map<Integer,List<UseCase>> groupedList = list.stream().collect(Collectors.groupingBy(UseCase::getSn));
        System.out.println(groupedList);
    }


}
class UseCase {
    private int sn;
    private String name;

    public int getSn() {
        return sn;
    }

    public String getName() {
        return name;
    }

    public UseCase(int sn,String name) {
        this.sn = sn;
        this.name = name;
    }

    @Override
    public String toString() {
        return "{" +
                "sn=" + sn +
                ", name='" + name + '\'' +
                '}';
    }
}

    运行程序,打印结果如下:

{1=[{sn=1, name='test01'}, {sn=1, name='test02'}], 2=[{sn=2, name='test02'}], 3=[{sn=3, name='test03'}]}

    返回结果是一个属性与列表的map映射。相同的sn为一组,这里按照sn分成了3组,第一组里面有两个sn相同,所以它的集合里有两个对象。

    =====================

    这里的UseCase::getSn是一个方法函数,goupingBy(Function)需要传入一个函数。这里如果我们不使用UseCase对象,而是使用map映射,这里需要怎么来传参呢?示例如下:

List<Map<String,Object>> mapList = new ArrayList<>();
mapList.add(new HashMap<>(){{put("sn",1);put("name","test01");}});
mapList.add(new HashMap<>(){{put("sn",1);put("name","test02");}});
mapList.add(new HashMap<>(){{put("sn",2);put("name","test02");}});
mapList.add(new HashMap<>(){{put("sn",3);put("name","test03");}});
Map<Integer,List<Map>> groupedList2 = mapList.stream().collect(Collectors.groupingBy(e->(Integer) e.get("sn")));
System.out.println(groupedList2);

    运行结果:

{1=[{name=test01, sn=1}, {name=test02, sn=1}], 2=[{name=test02, sn=2}], 3=[{name=test03, sn=3}]}

    这里的结果和上面使用UseCase对象的时候一样,相同sn的被分到了一组。 

    这里我们传入的是一个lambda表达式函数,表达式是求map映射中sn的值,和使用对象传入UseCase::getSn效果是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值