平时工作中,在很多场景下面会用到将 List 集合转换成 Map 对象的格式,提高效率。我们可以使用 Collectors.groupingBy 对指定的属性进行分组,转换成 Map 格式。
package com.haicoder.net.array;
public class Student {
/**
* 班级ID
*/
private Integer calssId;
/**
* 学生学号
*/
private String stuNo;
/**
* 学生姓名
*/
private String stuName;
/**
* 学生年龄
*/
private Integer age;
public Student(Integer calssId, String stuNo, String stuName, Integer age) {
this.calssId = calssId;
this.stuNo = stuNo;
this.stuName = stuName;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"calssId=" + calssId +
", stuNo='" + stuNo + '\'' +
", stuName='" + stuName + '\'' +
", age=" + age +
'}';
}
//.... 省略 get set 方法
}
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "001", "小明",20));
studentList.add(new Student(1, "002", "小军",18));
studentList.add(new Student(1, "003", "小杰",19));
studentList.add(new Student(2, "001", "小亮",20));
studentList.add(new Student(3, "001", "小珍",18));
studentList.add(new Student(2, "002", "小琦",19));
studentList.add(new Student(3, "002", "小甲",15));
按照班级分组,以班级 Id 为 key,将数据转换成 Map
Map<Integer, List<Student>> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(Student::getCalssId));
将班级和年龄进行拼接分组
Map<String, List<Student>> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(student -> student.getCalssId() + "-" + student.getAge()));
年龄小于 19 岁分一个组,大于等于 19 岁分另外一个组
Map<String, List<Student>> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(student -> {
if (student.getAge() < 19) {
return "未成年";
} else {
return "成年";
}
}));
获取每个班级下面的学生总数
Map<Integer, Long> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(Student::getCalssId, Collectors.counting()));
package com.haicoder.net.array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StudentTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "001", "小明", 20));
studentList.add(new Student(1, "002", "小军", 18));
studentList.add(new Student(1, "003", "小杰", 19));
studentList.add(new Student(2, "001", "小亮", 20));
studentList.add(new Student(3, "001", "小珍", 18));
studentList.add(new Student(2, "002", "小琦", 19));
studentList.add(new Student(3, "002", "小甲", 15));
Map<Integer, List<Student>> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(Student::getCalssId));
classIdAndStudentMap.entrySet().forEach(tmp -> {
System.out.println("班级ID:" + tmp.getKey());
System.out.println("班级学生:" + tmp.getValue().toString());
});
}
}
运行结果如下:
package com.haicoder.net.array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StudentTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "001", "小明", 20));
studentList.add(new Student(1, "002", "小军", 18));
studentList.add(new Student(1, "003", "小杰", 19));
studentList.add(new Student(2, "001", "小亮", 20));
studentList.add(new Student(3, "001", "小珍", 18));
studentList.add(new Student(2, "002", "小琦", 19));
studentList.add(new Student(3, "002", "小甲", 15));
Map<String, List<Student>> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(student -> student.getCalssId() + "-" + student.getAge()));
classIdAndStudentMap.entrySet().forEach(tmp -> {
System.out.println("key 值:" + tmp.getKey());
System.out.println("班级学生:" + tmp.getValue().toString());
});
}
}
运行结果如下
package com.haicoder.net.array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StudentTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "001", "小明", 20));
studentList.add(new Student(1, "002", "小军", 18));
studentList.add(new Student(1, "003", "小杰", 19));
studentList.add(new Student(2, "001", "小亮", 20));
studentList.add(new Student(3, "001", "小珍", 18));
studentList.add(new Student(2, "002", "小琦", 19));
studentList.add(new Student(3, "002", "小甲", 15));
Map<String, List<Student>> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(student -> {
if (student.getAge() < 19) {
return "未成年";
} else {
return "成年";
}
}));
classIdAndStudentMap.entrySet().forEach(tmp -> {
System.out.println("key 值:" + tmp.getKey());
System.out.println("value 值:" + tmp.getValue().toString());
});
}
}
运行结果如下
package com.haicoder.net.array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StudentTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "001", "小明", 20));
studentList.add(new Student(1, "002", "小军", 18));
studentList.add(new Student(1, "003", "小杰", 19));
studentList.add(new Student(2, "001", "小亮", 20));
studentList.add(new Student(3, "001", "小珍", 18));
studentList.add(new Student(2, "002", "小琦", 19));
studentList.add(new Student(3, "002", "小甲", 15));
Map<Integer, Long> classIdAndStudentMap = studentList.stream().collect(Collectors.groupingBy(Student::getCalssId, Collectors.counting()));
classIdAndStudentMap.entrySet().forEach(tmp -> {
System.out.println("班级ID 值:" + tmp.getKey() + "====》" + "班级学生数量:" + tmp.getValue());
});
}
}
运行结果如下