一般的我们对List<Map<XX,XX>>类型排序可以这样写
对Score进行排序:
(map1、map2、map3都不为 null )
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());
System.out.println(resultlist);
上面的代码可以正常运行,但是这个时候如果王五的 Score 的值为 null,那么上面的排序操作就会报空指针异常,毕竟他的分数都是空了还怎么排序,你说是吧。
此时就可以使用 nullsFirst() 或 nullsLast() 来进行对属性值为 null 的情况进行排序处理。
简单来说:
如果属性值是 null 时使用 nullsFirst() 那么排序时默认为空的这个值就比别的大 ,那排序后王五就靠前;
如果属性值是 null 时使用 nullsLast() 那么排序时默认为空的这个值就比别的小 ,那排序后王五就靠后;
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.如果指定的比较器可序列化,则返回的比较器可序列化。
因此上面的排序可以像下面这样写来避免 Score 的值为 null 时排序导致的空指针异常:
//升序
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(Comparator.reverseOrder())));