我有一个像下面这样的json:
list.forEach(studentObj -> {
studentObj.getSubjects()
.sort(Comparator.nullsLast(Comparator.comparing(Subject:: getSubjectCode)));
});
我想对每个学生的科目列表进行排序,然后按卷编号对学生对象进行排序。可以用java8在一行中完成。
我正在使用以下代码:
list.sort(Comparator.nullsLast(Comparator.comparing(Student:: getRollNo)));
然后对外部对象进行排序
{{1}}
答案 0 :(得分:2)
将其解析为对象后,您可以编写如下内容:
List<Student> sorted = students.stream()
.map(f -> new Student(f.getId(), f.getSubjects().stream().sorted(Comparator.comparing(Subject::getSubjectCode)).collect(Collectors.toList())))
.sorted(Comparator.comparing(Student::getRollNo))
.collect(Collectors.toList())
答案 1 :(得分:2)
如果您要使用自己的2个类Student
和Subject
实现Comparable interface,则可以使它变得非常好而简短,因为可以使用Comparator.naturalOrder()静态工厂方法
它还允许您通过简单地更改其Subjects
方法来更改想要定义Students
或compareTo
的方式
学生
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());
答案 2 :(得分:0)
以下是一些使用Java流入门的示例。
List<String> sorted = new ArrayList<>(Arrays.asList("Input1", "Input2", "Etc")).stream().sorted((a, b) -> a.compareTo(b));
List<String> sorted = json.stream().sorted((a, b) -> a.compareTo(b));
List<String> sorted = json.stream().sorted();
这里是如何对列表中的所有列表进行排序,因此您现在可以进行重构以使其成为一个衬里
void method() {
sort(list);
}
void sort(List list) {
if (list.size() == 0)
return;
list.stream().sorted();
for (Object o : list)
if (o instanceof List)
sorted((List) o);
}
以下是对Java流的一些引用:
API文档:
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
示例:
答案 3 :(得分:-1)
尝试这个
List<Student> result = new ArrayList<>();
studentList.stream()
.sorted(Comparator.comparingInt(Student::getRollNo))
.map(student -> {
student.getSubjects().sort(Comparator.nullsLast(Comparator.comparing(Subjects::getSubjectCode)));
return student;
}).collect(Collectors.toList());