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

}
相关推荐
happymaker06268 小时前
Spring框架学习日记——DAY02(依赖注入的方式)
windows
平凡但不平庸的码农8 小时前
Go Channel详解
开发语言·后端·golang
NE_STOP8 小时前
Redis--Redis分布式系统的原理与实操
java
laomocoder8 小时前
Project-Nexus-WAN-跨公网Agent对话
开发语言·php
子安柠8 小时前
深入理解 Go 语言文件操作:从基础到最佳实践
开发语言·后端·golang
代码中介商8 小时前
C++文件流操作全解析
开发语言·c++
Forget_85508 小时前
RHEL——Kubernetes容器编排平台(二)
java·开发语言
Achou.Wang8 小时前
go语言中使用等待组(waitgroups)和内存屏障(barriers)进行同步
开发语言·后端·golang
honder试试8 小时前
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
windows·elasticsearch·jenkins
MATLAB代码顾问8 小时前
【智能优化】鹈鹕优化算法(POA)原理与Python实现
开发语言·python·算法