这是我在名为 Course
的类(class)中的类(class)模型:
public class Course{
private int courseId;
private String courseName;
private Teacher teacher;
}
这是我在名为 Teacher
的类(class)中的教师模型:
public class Teacher{
private int teacherId;
private String name;
}
我想要一个Map<String, List<Course>>
但如果 teacherId
重复只需添加 Course
进入 map 列表。
我正在使用 groupBy
为它
Map<Integer, List<Course>> result = courses.stream()
.collect(Collectors.groupingBy(c -> c.getTeacher().getTeacherId(), Collectors.toList()));
它给出了预期的结果。
但我想limit
在这里,一旦找到 5 位老师就停止处理并返回结果。
怎么做到的?
最佳答案
对此没有直接的支持,因为停止并接受可能不完整的数据是很不寻常的。
完全收集前五组的直接解决方案是
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
列表没有多大意义,因为你以后不能相信这些列表。请记住,即使是源列表的最后一个元素也可能属于第一个遇到的教师 ID,因此即使您只对一位教师的完整类(class)列表感兴趣,也需要处理整个列表。
关于java - 如何限制groupBy java流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621563/