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());
                }
            }
        }
    }

}
相关推荐
lqj_本人2 分钟前
Rust与Go:现代系统编程语言的深度对比
开发语言·golang·rust
我命由我1234511 分钟前
Android WebView - loadUrl 方法的长度限制
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
前端架构师-老李19 分钟前
Maven安装以及环境变量配置(macOS)
java·macos·maven
星释19 分钟前
Rust 练习册 :Macros与宏系统
开发语言·后端·rust
l1t26 分钟前
利用短整数类型和部分字符串优化DuckDB利用数组求解数独SQL
开发语言·数据库·sql·duckdb
权泽谦40 分钟前
从零搭建一个 PHP 登录注册系统(含完整源码)
android·开发语言·php
带刺的坐椅42 分钟前
(对标 Spring IA 和 LangChain4j)Solon AI & MCP v3.7.0, v3.6.4, v3.5.8 发布(支持 LTS)
java·spring·ai·solon·mcp·langchain4j
7澄144 分钟前
深入解析 LeetCode 1572:矩阵对角线元素的和 —— 从问题本质到高效实现
java·算法·leetcode·矩阵·intellij-idea
PieroPc1 小时前
用python Streamlit 做个RapidOCR 文本识别系统
开发语言·python·ocr
诗9趁年华1 小时前
缓存三大问题深度解析:穿透、击穿与雪崩
java·spring·缓存