一般的我们对List<Map<XX,XX>>类型排序可以这样写
对Score进行排序:
List<Map<String, Object>> resultlist = new ArrayList<>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("id", "1");
map1.put("name", "张三");
map1.put("Score", 86.5);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("id", "2");
map2.put("name", "李四");
map2.put("Score", 90.0);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("id", "3");
map3.put("name", "王五");
map3.put("Score", 70.5);
resultlist.add(map1);
resultlist.add(map2);
resultlist.add(map3);
//升序
resultlist.sort(Comparator.comparing((Map<String, Object> m) -> ((Double) m.get("Score"))));
//降序
//resultlist.sort(Comparator.comparing((Map<String, Object> m) -> ((Double) m.get("Score"))).reversed());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
但是这个时候如果王五的Score为null,name上面的排序操作就会报错。
此时就可以使用nullsFirst()或nullsLast()来进行对null的处理。
nullsFirst():
此方法返回比较器,其是空型比较,并认为空值小于非空。null首先通过以下逻辑进行操作:
1.null元素被认为小于non-null(即值是null的小于非空的)。
2.当两个元素都为空时,则认为它们相等。
3.当两个元素都不为空时,指定的Comparator确定顺序。
4.如果指定的比较器为null,则返回的比较器将所有非null元素视为相等。
5.如果指定的比较器可序列化,则返回的比较器可序列化。
nullsLast():
方法返回比较器,其是空型比较,并认为比非空更大空值。null首先通过以下逻辑进行操作:
1.null元素被认为大于非null。
2.当两个元素都为空时,则认为它们相等。
3.当两个元素都不为空时,指定的Comparator确定顺序。
4.如果指定的比较器为null,则返回的比较器将所有非null元素视为相等。
5.如果指定的比较器可序列化,则返回的比较器可序列化。
因此上面的排序可以这样写来避免出现空指针异常:
//升序
resultlist.sort(Comparator.comparing((Map<String, Object> m) -> ((Double)m.get("Score")),Comparator.nullsLast(Comparator.naturalOrder())));
//降序
resultlist.sort(Comparator.comparing((Map<String, Object> m) -> ((Double)m.get("Score")),Comparator.nullsLast(Compara