如何限制groupBy java流

Iti*_*pta 8 java lambda java-8 java-stream

这是我课程中的课程模型Course:

public class Course{
    private int courseId;
    private String courseName;
    private Teacher teacher;
}
Run Code Online (Sandbox Code Playgroud)

这是我班级中的老师模型Teacher:

public class Teacher{
    private int teacherId;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

我想得到一个,Map<String, List<Course>>但如果teacherId重复只是将其添加Course到地图列表中.

我正在使用groupBy

Map<Integer, List<Course>>  result = courses.stream()
        .collect(Collectors.groupingBy(c -> c.getTeacher().getTeacherId(), Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

它正在按预期给出结果.

但我想在limit这里找到5名教师停止处理并返回结果.

怎么做到呢??

Hol*_*ger 7

没有直接支持这一点,因为停止和生活可能不完整的数据是相当不寻常的.

完全收集前五个组的直接解决方案是

Set<Integer> firstFive = courses.stream()
    .map(c -> c.getTeacher().getTeacherId())
    .distinct().limit(5)
    .collect(Collectors.toSet());
Map<Integer, List<Course>> result = courses.stream()
    .filter(c -> firstFive.contains(c.getTeacher().getTeacherId()))
    .collect(Collectors.groupingBy(c -> c.getTeacher().getTeacherId()));
Run Code Online (Sandbox Code Playgroud)

这里,Course前五个教师ID 的列表已经完成.


在遇到第5个教师ID后真正停止的解决方案,循环更简单:

Map<Integer, List<Course>> result = new HashMap<>();
for(Course c: courses) {
    result.computeIfAbsent(c.getTeacher().getTeacherId(), x -> new ArrayList<>()).add(c);
    if(result.size() == 5) break;
}
Run Code Online (Sandbox Code Playgroud)

但是收集Courses的列表没有多大意义,之后你不能相信这些列表.请记住,即使源列表的最后一个元素也可能属于第一个遇到的教师ID,因此即使您只对一个教师的完整课程列表感兴趣,也需要处理整个列表.

  • 我只知道你会得到一个很好的答案 (2认同)