Java将列表转换为集合图[重复]
Posted
技术标签:
【中文标题】Java将列表转换为集合图[重复]【英文标题】:Java convert a list to a map of sets [duplicate] 【发布时间】:2018-02-28 20:12:28 【问题描述】:假设我有一个名为 Student 的对象列表。对象 Student 是这样定义的
public Class Student
private String studentName;
private String courseTaking;
在学生列表中,可以有多个学生对象具有相同的studentName但不同的courseTaking。现在我想把学生列表变成一张studentName和courseTaking的地图
Map<String, Set<String>>
键是studentName,值是把同一个学生的所有课程放在一起作为一个集合。如何使用 stream() 和 collect() 做到这一点?
【问题讨论】:
当你问如何“使用 lambda 表达式”时,你真的是想问如何使用 Streams 来做到这一点?因为它可以通过 Streams 和方法引用 (假设存在 getter 方法) 来完成,没有任何 lambda 表达式,所以你的问题是为什么它必须使用 lambda 表达式? 是的,我确实是想使用 stream()。很抱歉在初稿中没有说清楚。我可以使用 groupBy() 将列表转换为列表映射,但我不知道如何将其转换为集合映射。 所以您为学生正在学习的每门课程重复了Student
对象?肯定感觉不对。课程应该是Student
对象中的一个数组。
students.stream().collect(groupingBy(Student::getStudentName, mapping(Student::getCourseTaking, toSet())))
【参考方案1】:
我想这就是你要找的东西:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class ***
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]
【讨论】:
以上是关于Java将列表转换为集合图[重复]的主要内容,如果未能解决你的问题,请参考以下文章