这是我在名为Course
的课程中的课程模型:
public class Course{
private int courseId;
private String courseName;
private Teacher teacher;
}
这是我名为Teacher
的课程中的老师模型:
public class Teacher{
private int teacherId;
private String name;
}
我想获得Map<String, List<Course>>
,但如果teacherId
重复,只需将Course
添加到地图列表中即可。
我正在使用groupBy
Map<Integer, List<Course>> result = courses.stream()
.collect(Collectors.groupingBy(c -> c.getTeacher().getTeacherId(), Collectors.toList()));
它正在按预期给出结果。
但我想在limit
这里找到5名教师停止处理并返回结果。
怎么做?
答案 0 :(得分: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()));
此处,前五位教师ID的Course
列表已完成。
在遇到第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;
}
但是收集Course
s的列表没有多大意义,之后你不能相信这些列表。请记住,即使源列表的最后一个元素也可能属于第一个遇到的教师ID,因此即使您只对一位教师的完整课程列表感兴趣,也需要处理整个列表。
答案 1 :(得分:2)
不确定这是不是你要问的。
Map<Integer, List<Course>> map = new HashMap<>();
courses.stream().filter(course -> map.keySet().size() < 10)
.forEach(entry -> {
// The code below can be simplified
int teacherId = entry.getTeacher().getTeacherId();
if(map.get(teacherId) != null)
map.get(teacherId).add(entry);
else
map.put(teacherId, Lists.newArrayList(entry));
});