准备阶段
java
复制代码
public class Student {
private Integer id;
private String name;
public Student(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
基础排序
- 升序排序
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(1003, "王五"));
list.add(new Student(1002, "李四"));
list.sort(Comparator.comparingInt(Student::getId));
System.out.println(list);
复制代码
# 输出结果
[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1003, name='王五'}]
- 降序排序
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(1003, "王五"));
list.add(new Student(1002, "李四"));
list.sort((o1, o2) -> o2.getId() - o1.getId());
System.out.println(list);
复制代码
# 输出结果
[Student{id=1003, name='王五'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]
含有 null 值字段的对象排序
1、自定义 Comparator
- 升序排序,含有 null 值字段的对象放在最后面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort((o1, o2) -> {
Integer id1 = o1.getId();
Integer id2 = o2.getId();
if (id1 == null && id2 == null) {
return 0;
}
if (id1 == null) {
return 1;
}
if (id2 == null) {
return -1;
}
return id1 - id2;
});
System.out.println(list);
复制代码
# 输出结果
[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
- 降序排序,含有 null 值字段的对象放在最后面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort((o1, o2) -> {
Integer id1 = o1.getId();
Integer id2 = o2.getId();
if (id1 == null && id2 == null) {
return 0;
}
if (id1 == null) {
return 1;
}
if (id2 == null) {
return -1;
}
return id2 - id1;
});
System.out.println(list);
复制代码
# 输出结果
[Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
- 升序排序,含有 null 值字段的对象放在最前面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort((o1, o2) -> {
Integer id1 = o1.getId();
Integer id2 = o2.getId();
if (id1 == null && id2 == null) {
return 0;
}
if (id1 == null) {
return -1;
}
if (id2 == null) {
return 1;
}
return id1 - id2;
});
System.out.println(list);
复制代码
# 输出结果
[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}]
- 降序排序,含有 null 值字段的对象放在最前面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort((o1, o2) -> {
Integer id1 = o1.getId();
Integer id2 = o2.getId();
if (id1 == null && id2 == null) {
return 0;
}
if (id1 == null) {
return -1;
}
if (id2 == null) {
return 1;
}
return id2 - id1;
});
System.out.println(list);
复制代码
# 输出结果
[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]
2、使用 Comparator
- 升序排序,含有 null 值字段的对象放在最后面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort(
Comparator.comparing(
Student::getId,
Comparator.nullsLast(Comparator.naturalOrder())
)
);
System.out.println(list);
复制代码
# 输出结果
[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
- 降序排序,含有 null 值字段的对象放在最后面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort(
Comparator.comparing(
Student::getId,
Comparator.nullsLast(Comparator.reverseOrder())
)
);
System.out.println(list);
复制代码
# 输出结果
[Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
- 升序排序,含有 null 值字段的对象放在最前面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort(
Comparator.comparing(
Student::getId,
Comparator.nullsFirst(Comparator.naturalOrder())
)
);
System.out.println(list);
复制代码
# 输出结果
[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}]
- 降序排序,含有 null 值字段的对象放在最前面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
list.sort(
Comparator.comparing(
Student::getId,
Comparator.nullsFirst(Comparator.reverseOrder())
)
);
System.out.println(list);
复制代码
# 输出结果
[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]
3、使用 Stream API
- 升序排序,含有 null 值字段的对象放在最后面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
List<Student> sortedList = list.stream()
.sorted(Comparator.comparing(
Student::getId,
Comparator.nullsLast(Comparator.naturalOrder())
))
.collect(Collectors.toList());
System.out.println(sortedList);
复制代码
# 输出结果
[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
- 降序排序,含有 null 值字段的对象放在最后面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
List<Student> sortedList = list.stream()
.sorted(Comparator.comparing(
Student::getId,
Comparator.nullsLast(Comparator.reverseOrder())
))
.collect(Collectors.toList());
System.out.println(sortedList);
复制代码
# 输出结果
[Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
- 升序排序,含有 null 值字段的对象放在最前面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
List<Student> sortedList = list.stream()
.sorted(Comparator.comparing(
Student::getId,
Comparator.nullsFirst(Comparator.naturalOrder())
))
.collect(Collectors.toList());
System.out.println(sortedList);
复制代码
# 输出结果
[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}]
- 降序排序,含有 null 值字段的对象放在最前面
java
复制代码
List<Student> list = new ArrayList<>();
list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));
List<Student> sortedList = list.stream()
.sorted(Comparator.comparing(
Student::getId,
Comparator.nullsFirst(Comparator.reverseOrder())
))
.collect(Collectors.toList());
System.out.println(sortedList);
复制代码
# 输出结果
[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]