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

Java8嵌套列表排序:先排科目再按学号排学生(能否单行实现)

当然可以用Java 8实现单行代码完成需求!

完全没问题,我们可以利用Java 8的流式API结合中间操作peek(),把“排序每个学生的Subjects列表”和“按Roll No排序Student列表”这两步合并成一行代码。

单行实现代码(函数式风格,生成新列表)

list = list.stream().peek(s -> s.getSubjects().sort(Comparator.nullsLast(Comparator.comparing(Subject::getSubjectCode)))).sorted(Comparator.nullsLast(Comparator.comparing(Student::getRollNo))).collect(Collectors.toList());

代码解释

  • peek(s -> ...):对流中的每个Student对象执行Subjects排序操作,这一步会原地修改每个学生的Subjects列表;
  • sorted(...):按照Roll No对Student对象进行排序,保留了你原代码里的nullsLast来处理空值场景;
  • collect(Collectors.toList()):将处理后的流转换为新的List对象。

如果你希望直接修改原列表而非生成新列表,也可以用这种更贴近你原逻辑的单行写法:

list.forEach(s -> s.getSubjects().sort(Comparator.nullsLast(Comparator.comparing(Subject::getSubjectCode)))) && list.sort(Comparator.nullsLast(Comparator.comparing(Student::getRollNo)));

两种写法都能满足需求,前者更符合Java 8函数式编程的风格,后者则是在原列表基础上直接完成两次排序操作,你可以根据实际场景选择。

内容的提问来源于stack exchange,提问作者Anuj Kumar Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:39:32