Если бы вы реализовали Comparable интерфейс с вашими 2 классами Student
и Subject
, вы могли бы сделать его действительно красивым и коротким, потому что вы можете использовать Comparator.naturalOrder () статический фабричный метод
Также это позволяет вам изменить способ определения порядка Subjects
или Students
, просто изменив их compareTo
метод
Student
class Student implements Comparable<Student> {
String name;
int rollNo;
List<Subject> subjects = new ArrayList<>();
// GETTERS/SETTERS
@Override
public int compareTo(Student student) {
return Integer.compare(this.getRollNo(), student.getRollNo());
}
}
Тема
class Subject implements Comparable<Subject> {
String subjectCode;
// GETTERS/SETTERS
@Override
public int compareTo(Subject subject) {
return this.getSubjectCode().compareTo(subject.getSubjectCode());
}
}
А потом
// static import to make code lighter
import static java.util.Comparator.*;
// sort Students list, then sort Subjects list in each Student
list.sort(nullsLast(naturalOrder()));
list.forEach(s -> { if (s != null) {
s.getSubjects().sort(nullsLast(naturalOrder()));
}});
Версия с одним вкладышем , если вам действительно это нужно
List<Student> sortedList = list.stream()
.map(s -> {
if (s != null) {
s.getSubjects().sort(nullsLast(naturalOrder()));
}
return s;
}).sorted(nullsLast(naturalOrder()))
.collect(Collectors.toList());