一、stream toMap、groupingBy、mapping的综合应用
1、前提准备
①、实体类
package com.cfay.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student implements Serializable {
private Integer id;
private String name;
private Integer age;
}
②、数据准备
package com.cfay.demo;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class StudentData {
private StudentData() {
}
public static List<Student> buildStudents() {
List<Student> students = new ArrayList<>();
students.add(new Student(1, "小扇", 20));
students.add(new Student(1, "小雨", 22));
students.add(new Student(1, "小钰", 19));
students.add(new Student(1, null, 19));
students.add(new Student(2, "小蓝", 21));
students.add(new Student(2, "小天", 20));
return students.stream().filter(student ->
Objects.nonNull(student.getName())).sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
}
}
2、核心代码:
package com.cfay.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
handleStudentIdNameSplicteMap();
System.out.println("===================================");
handleStudentIdNamesMap();
}
private static void handleStudentIdNameSplicteMap() {
System.out.println("toMap ......");
Map<Integer, String> studentIdNameMap1 = StudentData.buildStudents().stream().collect(Collectors.toMap(Student::getId,
Student::getName, (pre, act) -> pre + "," + act));
System.out.println(studentIdNameMap1);
System.out.println("groupingBy ......");
Map<Integer, String> studentIdNameMap2 = StudentData.buildStudents().stream().collect(Collectors.groupingBy(Student::getId,
Collectors.mapping(Student::getName, Collectors.joining(","))));
System.out.println(studentIdNameMap2);
}
private static void handleStudentIdNamesMap() {
System.out.println("toMap ......");
Map<Integer, List<String>> studentIdNamesMap1 = StudentData.buildStudents().stream().collect(Collectors.toMap(Student::getId, student ->
new ArrayList<>(Collections.singletonList(student.getName())), (pre, act) -> {
pre.addAll(act);
return pre;
}));
System.out.println(studentIdNamesMap1);
System.out.println("groupingBy ......");
Map<Integer, List<String>> studentIdNamesMap2 = StudentData.buildStudents().stream().collect(Collectors.groupingBy(Student::getId,
Collectors.mapping(Student::getName, Collectors.toList())));
System.out.println(studentIdNamesMap2);
}
}
3、运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/7e96a1cfead043b0a61e308fb4348cf1.png)