关于lambda:Java将列表转换为集合的映射

Java convert a list to a map of sets

本问题已经有最佳答案,请猛点这里访问。

假设我有一个名为Student的对象列表。 对象学生的定义是这样的

1
2
3
4
public Class Student {
    private String studentName;
    private String courseTaking;
}

在学生列表中,可以有多个学生对象具有相同的studentName但不同的courseTaking。 现在我想将学生列表转换为studentName和courseTaking的地图

1
Map<String, Set<String>>

关键是studentName,并且该值是同一个学生作为一组放在一起的所有课程。 我怎么能用stream()和amp; 搜集()?


我想这就是你要找的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;


public class StackOverflow {

  private static class SO46310655 {
    public static void main(String[] args) {
      final List<Student> students = new ArrayList<>();
      students.add(new Student("Zoff","Java 101"));
      students.add(new Student("Zoff","CompSci 104"));
      students.add(new Student("Zoff","Lit 110"));
      students.add(new Student("Andreas","Kotlin 205"));
      Map<String, Set<String>> map = students.stream().collect(
          Collectors.groupingBy(
              Student::getStudentName,
              Collectors.mapping(
                  Student::getCourseTaking,
                  Collectors.toSet()
              )
          )
      );
      System.out.println(map);
    }

    public static class Student {
      private final String studentName;
      private final String courseTaking;

      public Student(String studentName, String courseTaking) {
        this.studentName = studentName;
        this.courseTaking = courseTaking;
      }

      public String getStudentName() {
        return studentName;
      }

      public String getCourseTaking() {
        return courseTaking;
      }
    }
  }
}

yeilds {Andreas=[Kotlin 205], Zoff=[Java 101, CompSci 104, Lit 110]}