Java中如何使用lambda表达式分类groupby
Java中如何使用lambda表达式分类groupby
- Java中如何使用lambda表达式分类groupby
- 分类问题场景
- 传统手写方式
- 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循环遍历
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;
}
输出结果
|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()方法一行结束!!!
private static Map<String, Map<Integer, List<Student>>> queueUpWithLambda(List<Student> students) {return students.stream().collect(Collectors.groupingBy(Student::getGender, Collectors.groupingBy(Student::getAge)));
}
完整代码
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@AllArgsConstructorpublic 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());}}}}}