java - 如何限制groupBy java流

标签 java lambda java-8 java-stream

这是我在名为 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/

相关文章:

java - servlet 是否共享同一个 servletoutputstream 对象?

java - 使用 DateTimeFormatter 解析没有月份的日期

使用 Visa QRParser-2.2.0 和 minSdkVersion 19 的 Android 构建失败(transformClassesWithDesugar)

java - 迭代非列表的最短方法?

vb.net - 在动态对象上使用动态表达式的 VB Linq 排序

java - Oracle 数据库更改通知仅每 15 分钟发送一次

java - java中不同版本的标识符?

java - 我怎样才能最好地将这个java方法翻译成python

.net - Lambda多线作为线程参数?

c# - 如何创建表达式树以执行与 "StartsWith"相同的操作