Java 将列表转换为按键分组的集合映射[重复]

问题描述 投票:0回答:1

假设我有一个名为

Student
的对象列表。对象
Student
定义为

    public class Student {
        private String studentName;
        private String courseTaking;
    }

在学生列表中,可以存在多个具有相同

studentName
但不同课程的学生对象。现在我想把学生名单变成
studentName
courseTaking
的地图,就像这样

Map<String, Set<String>>

键是

studentName
,值是同一学生的所有
courseTaking
放在一起作为一个
Set
。我如何使用
stream()
collect()
来做到这一点?

java lambda java-8 java-stream
1个回答
11
投票

我认为这就是您正在寻找的:

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

产量

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

© www.soinside.com 2019 - 2024. All rights reserved.