You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8:使用Streams和Lambda根据子列表条件过滤父列表

解决学生筛选时的数组越界问题

兄弟,咱先搞明白你为啥会碰到java.lang.ArrayIndexOutOfBoundsException: 27745这个异常——**肯定是你在取学生的第一门科目时,没考虑到有些学生的科目列表是空的,甚至可能是null!**那个27745就是出错时的索引值,说明遍历到第27746个学生(索引从0开始算)的时候,他的科目列表根本没有第一个元素,自然就越界了。

正确的筛选逻辑实现

下面给你两种靠谱的实现方式,核心都是先做安全校验,再判断分数:

方式1:用Stream API(简洁高效,推荐)

List<Student> qualifiedStudents = studentList.stream()
    .filter(student -> {
        List<Subject> subjects = student.getSubjects();
        // 先确保科目列表非空、不为null,再判断第一门课的分数
        return subjects != null && !subjects.isEmpty() && subjects.get(0).getScore() >= 70;
    })
    .collect(Collectors.toList());

方式2:传统for循环(适合新手理解)

List<Student> qualifiedStudents = new ArrayList<>();
for (Student student : studentList) {
    List<Subject> subjects = student.getSubjects();
    // 先做安全校验,避免越界和空指针
    if (subjects != null && !subjects.isEmpty()) {
        Subject firstSubject = subjects.get(0);
        if (firstSubject.getScore() >= 70) {
            qualifiedStudents.add(student);
        }
    }
    // 要是科目列表为空或null,直接跳过这个学生就行
}

额外的避坑建议

  • 提前初始化科目列表:在Student类的构造方法里,把subjects初始化为new ArrayList<>(),这样student.getSubjects()就永远不会返回null,后续代码里可以少一层null判断。
  • 检查数据源合法性:可以查一下为啥会出现没有科目的学生,是数据导入时的bug,还是业务上允许这种情况?如果业务不允许,最好在数据录入阶段就加校验,从源头避免问题。

内容的提问来源于stack exchange,提问作者Hruday

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:08:05