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

