Zof*_*off 5 java-8 java-stream
我有两张地图,即
Map<String, Set<String>> courseTeacherMap = {course1: [teacher1, teacher2], ...}
Map<String, Set<String>> teacherStudentMap = {teacher1: [student1, student2], ...}
Run Code Online (Sandbox Code Playgroud)
我定义了courseStudentPair一个结构非常简单的类
public class courseStudentPair{
String studentName; // Taken from teacherStudentMap
String courseName; // Taken from courseTeacherMap
}
Run Code Online (Sandbox Code Playgroud)
我的目标是Set<courseStudentPair>从两张地图中获取一张.只要教师A正在教授课程C,每个在A键值中设置的teacherStudentMap学生都被认为是学习C的学生.
例如,给定
Map<String, Set<String>> courseTeacherMap = {c1: [t1], c2:[t2], c3:[t1, t2]}
Map<String, Set<String>> teacherStudentMap = {t1: [s1], t2:[s1, s2]}
Run Code Online (Sandbox Code Playgroud)
结果应该是*(student,course)表示下面示例中的courseStudentPair对象*
Set<courseStudentPair> result = [(c1, s1), (c2, s1), (c2, s2), (c3, s1), (c3, s2)]
Run Code Online (Sandbox Code Playgroud)
使用for循环来完成它非常简单,但我正在学习Java 8中的流函数,这对我来说似乎很复杂.您可以假设courseStudentPair该类已定义构造函数或构建器.
本着同样的精神,您可以生成(课程、教师)的每个组合,然后查找与该教师关联的学生。这可能会生成重复项(例如 (c3, s1)),因此请确保您的CourseStudentPair类实现equals()并hashCode()基于这两个字段。
import static java.util.Collections.emptySet;
import static java.util.stream.Collectors.toSet;
...
Set<CourseStudentPair> result =
courseTeacherMap.entrySet()
.stream()
.flatMap(e -> e.getValue()
.stream()
.flatMap(t -> teacherStudentMap.getOrDefault(t, emptySet()).stream().map(s -> new CourseStudentPair(e.getKey(), s))))
.collect(toSet());
/*
Output:
CourseStudentPair{studentName='c1', courseName='s1'}
CourseStudentPair{studentName='c2', courseName='s2'}
CourseStudentPair{studentName='c2', courseName='s1'}
CourseStudentPair{studentName='c3', courseName='s2'}
CourseStudentPair{studentName='c3', courseName='s1'}
*/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1671 次 |
| 最近记录: |