Java中如何使用lambda表达式分类groupby

Java中如何使用lambda表达式分类groupby

Java中如何使用lambda表达式分类groupby

分类问题场景

比如一群学生根据性别和年龄排队,Student类有性别gender、年龄age属性,将同性别,同年龄的学生归为一类

gender age name 队伍
man 12 Li Hua 队伍1
man 12 Zhang San 队伍1
man 13 Li Si 队伍2
woman 12 Xiao Hua 队伍3
woman 12 Xiao Fang 队伍3

传统手写方式

使用for循环遍历

java 复制代码
public static void main(String[] args) {
    // 读取学生信息
    List<Student> students = generateStudents();
    // 排队
    Map<String, Map<Integer, List<Student>>> queue = queueUp(students);
    // 打印队伍结果
    printQueue(queue);
}

private static Map<String, Map<Integer, List<Student>>> queueUp(List<Student> students) {
    // 队伍结果
    Map<String, Map<Integer, List<Student>>> queue = new HashMap<>();
    // 传统排队方式
    for (Student student : students) {
        if (!queue.containsKey(student.getGender())) {
            queue.put(student.getGender(), new HashMap<>());
        }
        Map<Integer, List<Student>> ageMap = queue.get(student.getGender());
        if (!ageMap.containsKey(student.getAge())) {
            List<Student> list = new ArrayList<>();
            list.add(student);
            ageMap.put(student.getAge(), list);
        } else {
            ageMap.get(student.getAge()).add(student);
        }
    }

    return queue;
}

输出结果

shell 复制代码
|gender|age|name      |
|------|---|----------|
|woman |12 |Xiao Hua  |
|woman |12 |Xiao Fang |
|man   |12 |Li Hua    |
|man   |12 |Zhang San |
|man   |13 |Li Si     |

lambda使用groupBy()方法一行结束!!!

java 复制代码
private static Map<String, Map<Integer, List<Student>>> queueUpWithLambda(List<Student> students) {
    return students.stream().collect(Collectors.groupingBy(Student::getGender, Collectors.groupingBy(Student::getAge)));
}

完整代码

java 复制代码
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class DemoForGroupBy {

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Student {
        private String gender;

        private int age;

        private String name;

    }

    public static void main(String[] args) {
        // 读取学生信息
        List<Student> students = generateStudents();

        // 排队
        Map<String, Map<Integer, List<Student>>> queue = queueUp(students);

        // 打印队伍结果
        printQueue(queue);

        queue = queueUpWithLambda(students);

        printQueue(queue);

    }

    private static Map<String, Map<Integer, List<Student>>> queueUp(List<Student> students) {
        // 队伍结果
        Map<String, Map<Integer, List<Student>>> queue = new HashMap<>();
        // 传统排队方式
        for (Student student : students) {
            if (!queue.containsKey(student.getGender())) {
                queue.put(student.getGender(), new HashMap<>());
            }
            Map<Integer, List<Student>> ageMap = queue.get(student.getGender());
            if (!ageMap.containsKey(student.getAge())) {
                List<Student> list = new ArrayList<>();
                list.add(student);
                ageMap.put(student.getAge(), list);
            } else {
                ageMap.get(student.getAge()).add(student);
            }
        }

        return queue;
    }

    private static Map<String, Map<Integer, List<Student>>> queueUpWithLambda(List<Student> students) {
        return students.stream().collect(Collectors.groupingBy(Student::getGender, Collectors.groupingBy(Student::getAge)));
    }

    private static List<Student> generateStudents() {
        List<Student> students = new ArrayList<>();
        String[] genderArray = new String[]{"man", "man", "man", "woman", "woman"};
        int[] ageArray = new int[]{12, 12, 13, 12, 12};
        String[] nameArray = new String[]{"Li Hua", "Zhang San", "Li Si", "Xiao Hua", "Xiao Fang"};
        for (int i = 0; i < nameArray.length; i++) {
            Student student = new Student(genderArray[i], ageArray[i], nameArray[i]);
            students.add(student);
        }
        return students;
    }

    private static void printQueue(Map<String, Map<Integer, List<Student>>> queue) {
        System.out.printf("|%-6s|%-3s|%-10s|%n", "gender", "age", "name");
        System.out.printf("|%-6s|%-3s|%-10s|%n", "------", "---", "----------");
        for (Map.Entry<String, Map<Integer, List<Student>>> entry : queue.entrySet()) {
            for (Map.Entry<Integer, List<Student>> e : entry.getValue().entrySet()) {
                for (Student student : e.getValue()) {
                    System.out.printf("|%-6s|%-3d|%-10s|%n", student.getGender(), student.getAge(), student.getName());
                }
            }
        }
    }

}
相关推荐
Cx330❀10 小时前
《C++:STL》详细深入解析string类(一):
开发语言·c++·经验分享
阿波罗尼亚10 小时前
复杂查询:直接查询/子查询/视图/CTE
java·前端·数据库
Q_Q196328847510 小时前
python+uniapp基于微信小程序的医院陪诊预约系统
开发语言·spring boot·python·微信小程序·django·flask·uni-app
THOVOH10 小时前
C++——类和对象(下)
开发语言·c++
杨筱毅10 小时前
【计算机通识】主流标准C库演进、差异和设计哲学【三】
c语言·开发语言·计算机通识
goTsHgo10 小时前
Spring XML 配置简介
xml·java·spring
青柠编程10 小时前
基于 Spring Boot 的医疗病历信息交互平台架构设计
java·spring boot·后端
专注代码七年11 小时前
IDEA JVM优化配置idea64.vmoptions - 保守兼容版本 兼容IDEA 2023.3.6版本【亲测可用】
java·jvm·intellij-idea
疯癫的老码农11 小时前
【word解析】Java文件解析问题排查:无法找到OMML2MML.xsl的IO异常解析
java·开发语言·spring boot·spring·maven
路弥行至11 小时前
C语言入门教程 | 第一讲:C语言零基础入门教程:第一个程序到变量运算详解
c语言·开发语言·经验分享·笔记·单片机·其他·课程设计