Java 8 stream()分组,过滤筛选 List<Object> 根据Object 中的某几个属性作为条件进行分组 去重过滤

List对象 筛选学生年龄 和性别一样的 进行分组,并且挑选出身高最高的 学生

Object类:Student

public class Student {

    private String name;
    private int age;
    private Long hight;
    private int sex;
    省去相应 get/set方法
    // 设置 年龄和性别的拼接,得出相应分组

    public Long getIwantStudent(){
        return  Long.valueOf(this.sex + this.age);
    }
public class GetTrueStudent {

    public static void main(String[] args) {
        List<Student> allList = new ArrayList<>();
        //添加集合信息 省去。。。
        Student st1 = new Student();
        st1.setAge(20);
        st1.setHight(178L);
        st1.setSex(1);
        st1.setName("韩梅梅");
        allList.add(st1);
        Student st11 = new Student();
        st11.setAge(20);
        st11.setHight(168L);
        st11.setSex(1);
        st11.setName("马冬梅");
        allList.add(st11);

        Student st2 = new Student();
        st2.setAge(21);
        st2.setHight(179L);
        st2.setSex(2);
        st2.setName("李磊");
        allList.add(st2);
        Student st22 = new Student();
        st22.setAge(21);
        st22.setHight(189L);
        st22.setSex(2);
        st22.setName("小李");
        allList.add(st22);

        // 以年龄 和 性别 分组,并选取最高身高的 学生
        Map<Long, Optional<Student>> allMapTask = allList.stream().collect(
                Collectors.groupingBy(Student::getIwantStudent, Collectors.maxBy((o1, o2) -> o1.getHight().compareTo(o2.getHight()))));

        // 遍历获取对象信息
        for (Map.Entry<Long,Optional<Student>> entry: allMapTask.entrySet()) {
            Student student = entry.getValue().get();
            System.out.println(student.toString());
        }
    }

}

重点知识点

Collectors.groupingBy 方法 根据Student对象中方法 作为分组条件,
Collectors.maxBy方法 筛选 每个分组中符合条件的 数据

可以使用 Java 8 的 Stream API 来对 List<T> 进行分组操作,具体实现方法如下: 1. 首先需要定义一个用于分组属性,假设该属性为 objProperty。 2. 利用 Stream 的 collect(Collectors.groupingBy()) 方法对 List 进行分组,其 Collectors.groupingBy() 方法的返回值为 Map<K, List<T>>,其 K 表示分组的键,List<T> 表示分组的值。 代码示例: ``` Map<Object, List<T>> groups = list.stream().collect(Collectors.groupingBy(T::getObjProperty)); ``` 其 T::getObjProperty 表示获取 T 对象的 objProperty 属性值。 3. 最终得到的 groups 就是按照 objProperty 属性分组后的结果。 完整代码示例: ``` public class Test { public static void main(String[] args) { List<Person> persons = new ArrayList<>(); persons.add(new Person("Tom", 20)); persons.add(new Person("Jerry", 25)); persons.add(new Person("Lucy", 20)); persons.add(new Person("Lily", 25)); Map<Integer, List<Person>> groups = persons.stream().collect(Collectors.groupingBy(Person::getAge)); System.out.println(groups); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 输出结果为: ``` {20=[Person{name='Tom', age=20}, Person{name='Lucy', age=20}], 25=[Person{name='Jerry', age=25}, Person{name='Lily', age=25}]} ``` 可以看到,按照年龄属性分组后,年龄为 20 的有 Tom 和 Lucy 两个人,年龄为 25 的有 Jerry 和 Lily 两个人。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值