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