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

}
相关推荐
麦麦鸡腿堡1 分钟前
Java_MySQL介绍
java·开发语言·mysql
于是我说1 分钟前
一份Python 面试常见问题清单 覆盖从初级到高级
开发语言·python·面试
shoubepatien1 分钟前
JavaWeb_Web基础
java·开发语言·前端·数据库·intellij-idea
北里闻箫3 分钟前
Java spinrg 4.x 及 jsp 简单心得(PHP转JAVA视角)
java·php·jsp
Charlie_Byte5 分钟前
Netty + Sa-Token 实现 WebSocket 握手认证
java·后端
计算机毕设VX:Fegn089514 分钟前
计算机毕业设计|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·课程设计·旅游
吧啦蹦吧15 分钟前
`org.springframework.util.ClassUtils#forName
开发语言·python
CC.GG16 分钟前
【C++】红黑树
java·开发语言·c++
学IT的周星星27 分钟前
java常见面试题
java·开发语言
wjs202437 分钟前
XPath 运算符
开发语言