Stream 分组之后筛选出最大的数据,或者多条件数据

时间:2025-03-12 09:45:00

Stream 分组之后筛选出最大的数据,或多条件筛选

用到的函数解释:

        // 函数解析(个人理解)
       Collectors.toMap(Function<? super T, ? extends K> keyMapper,
                                   Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction);
//        1、第一个参数:Function<? super T, ? extends K> keyMapper;  用于分组,做 Map的 key
//        2、第二个参数:Function<? super T, ? extends U> valueMapper;用于做 Map的 value(可以是对象中的某个属性,可以是对象,看自己选择)
//        3、第三个参数:BinaryOperator<U> mergeFunction; 分组之后组内有多个value, 在组内需要你取哪一个value

User 类在文章末尾

单条件筛选: Stream 分组后找出年纪最大的用户: main 方法测试一下:

 public static void main(String[] args) {
 							// name ,age,height,sex
        User user1 = new User("张三", 12, 150, 1);
        User user2 = new User("李四", 13, 150, 1);
        User user3 = new User("王五", 12, 140, 0);
        User user4 = new User("赵六", 11, 140, 0);
		// 将User对象转为List<User>
        List<User> users = Arrays.asList(user1, user2, user3, user4);
        /**
         *  key我用的是 User::getSex  性别
         *  () 保持stream中的对象作为value ,你用User::getName map的 value 便是 String(name)
         *  (a,b)-> () > () ? a : b  就是筛选出分组后年纪最大的一个 User 对象作为 value  
         */
        Map<Integer, User> map = users.stream().collect(
                        Collectors.toMap(User::getSex, Function.identity(), (a, b) -> a.getAge() > b.getAge() ? a : b)
        );
        for (Integer key : map.keySet()) {
            System.out.println(map.get(key));
        }

    }

运行结果如下:

User{name='王五', age=12, height=140, sex=0}
User{name='李四', age=13, height=150, sex=1}

多条件筛选:Stream 分组后的找到年纪最大的之后再筛选出身高最高的

public static void main(String[] args) {
							// name ,age,height,sex
        User user1 = new User("张三", 12, 150, 1);
        User user2 = new User("李四", 13, 150, 1);
        User user3 = new User("王五", 12, 140, 0);
        User user4 = new User("赵六", 11, 140, 0);
        // 增加两个人做筛选
        User user5 = new User("陆七", 12, 150, 0);
        User user6 = new User("田八", 13, 160, 1);

        List<User> users = Arrays.asList(user1, user2, user3, user4,user5,user6);

        /**
         *  筛选出男生、女生中 年纪最大、身高最高的一个
         */
        Map<Integer, User> map = users.stream().collect(
                Collectors.toMap(User::getSex, Function.identity(), (a, b) ->
                        a.getAge() > b.getAge() ?
                                a : a.getAge() == b.getAge() ? a.getHeight() > b.getHeight() ? a : b : b)
        );
        for (Integer key : map.keySet()) {
            System.out.println(map.get(key));
        }

    }

User 类

package cn.trunch.auth.util;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Author young
 * @Time 2023/6/15
 */
public class User {
    // 姓名
    public String name;
    // 年龄
    public int age;
    // 身高
    public int height;
    // 性别(1.男,0.女)
    public int sex;

    public User(String name, int age, int height, int sex) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                ", sex=" + sex +
                '}';
    }
    
}

总结

仅仅是自己记录一下自己在代码中遇到的问题,也是第一次写,有什么不好的还请打开指正,谢谢????