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
相关产品推荐
相关产品推荐

