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