Bean定義以下,僅有一個類型爲Integer
的age
字段。java
@NoArgsConstructor @AllArgsConstructor(staticName = "of") @Data public static class Employee { private Integer age; }
列表初始化5個元素:app
List<Employee> list = new ArrayList<>(); list.add(Employee.of(21)); list.add(Employee.of(22)); list.add(Employee.of(25)); list.add(Employee.of(28)); list.add(Employee.of(23));
使用Collections
中的sort
方法進行排序:ide
Collections.sort(list, new Comparator<Employee>() { @Override public int compare(Employee o1, Employee o2) { return o1.getAge().compareTo(o2.getAge()); } });
倒序:code
Collections.reverse(list);
JDK8支持lambda表達式,寫法更加簡潔:排序
Collections.sort(list, (o1, o2) -> o1.getAge().compareTo(o2.getAge()));
或者使用Comparator
接口:接口
Collections.sort(list, Comparator.comparing(Employee::getAge));
倒序:get
Collections.sort(list, Comparator.comparing(Employee::getAge).reversed());
list.stream().sorted(Comparator.comparing(Employee::getAge));
倒序:io
list.stream().sorted(Comparator.comparing(Employee::getAge).reversed());
list.sort(Comparator.comparing(Employee::getAge));
倒序:編譯
list.sort(Comparator.comparing(Employee::getAge).reversed());
假設列表中有age
字段爲null:ast
List<Employee> list = new ArrayList<>(); list.add(Employee.of(21)); list.add(Employee.of(null)); list.add(Employee.of(null)); list.add(Employee.of(28)); list.add(Employee.of(23));
這個時候會報NPE:
----------------------------- Exception in thread "main" java.lang.NullPointerException at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.util.TimSort.sort(TimSort.java:220) at java.util.Arrays.sort(Arrays.java:1512) at java.util.ArrayList.sort(ArrayList.java:1462)
可使用Comparator.comparing
的第2個參數:
list.sort(Comparator.comparing(Employee::getAge, Comparator.nullsLast(Comparator.naturalOrder()))); list.sort(Comparator.comparing(Employee::getAge, Comparator.nullsLast(Integer::compareTo))); list.sort(Comparator.comparing(Employee::getAge, Comparator.nullsLast(Comparable::compareTo)));
以上3中寫法均可以,注意第2個參數使用了Comparator.nullsLast
讓null排在最後。
與之對應的是Comparator.nullsFirst
能夠null排在最前。
最近項目中有個這樣場景,List中是個Map<String, Object>
,須要支持Map的任意key排序。
完整代碼以下:
import java.util.*; /** * @author cdfive * @date 2019-05-26 */ public class ListSortDemo2 { public static void main(String[] args) { List<Map<String, Object>> list = new ArrayList<>(); list.add(new HashMap<String, Object>(){{put("name", "aaa");put("age", 21);}}); list.add(new HashMap<String, Object>(){{put("name", "ccc");put("age", null);}}); list.add(new HashMap<String, Object>(){{put("name", "ddd");put("age", null);}}); list.add(new HashMap<String, Object>(){{put("name", "bbb");put("age", 28);}}); list.add(new HashMap<String, Object>(){{put("name", "aaa");put("age", 23);}}); printList(list); printLineSep(); sort(list, "age", "asc"); printList(list); } public static void sort(List<Map<String, Object>> list, String sortField, String sortDirection) { if ("desc".equals(sortDirection)) { Comparator<Map<String, Object>> comparator = Comparator.comparing(o -> (Comparable) o.get(sortField), Comparator.nullsFirst(Comparable::compareTo)); list.sort(comparator.reversed()); } else { Comparator<Map<String, Object>> comparator = Comparator.comparing(o -> (Comparable) o.get(sortField), Comparator.nullsLast(Comparable::compareTo)); list.sort(comparator); } } public static void printList(List<?> list) { list.stream().forEach(o -> System.out.print(o)); System.out.println(); } public static void printLineSep() { System.out.println("-----------------------------"); } }
注意:
倒序使用Comparator.nullsFirst
和comparator.reversed()
,須要單獨定義comparator變量,若是直接一行寫:
list.sort(Comparator.comparing(o -> (Comparable) o.get(sortField), Comparator.nullsFirst(Comparable::compareTo)).reversed());
會編譯不經過。
正序使用Comparator.nullsLast
。
正序null在後面,倒序null在前面,能夠這樣寫:
public static void sort2(List<Map<String, Object>> list, String sortField, String sortDirection) { Comparator<Map<String, Object>> comparator = Comparator.comparing(new Function<Map<String, Object>, Comparable>() { @Override public Comparable apply(Map<String, Object> map) { Object obj = map.get(sortField); if (obj instanceof Comparable) { return (Comparable) obj; } if (obj == null) { return null; } throw new UnsupportedOperationException("沒法排序的字段=" + sortField); } }, Comparator.nullsLast(Comparator.naturalOrder())); if ("desc".equals(sortDirection)) { list.sort(comparator.reversed()); } else { list.sort(comparator); } }