如何使用Java 8对地图列表进行排序?

如何使用Java 8对MapList进行排序? 映射包含名为last_name的键,与其关联的值可能为null 。 我不知道该怎么做,因为以下会导致编译器错误:

 List<Map> peopleList = ... peopleList.sort(Comparator.comparing(Map::get, Comparator.nullsLast(Comparator.naturalOrder()))); 

使用匿名类是唯一的方法吗?

请注意,我不是要尝试对列表中的每个地图进行排序。 我想根据每个地图中的一个键对列表本身进行排序。

看起来你可以重写你的代码

 peopleList.sort(Comparator.comparing( m -> m.get("yourKey"), Comparator.nullsLast(Comparator.naturalOrder())) ) 

由于您的peopleList可能包含null并且Map::key可能具有null值,因此您可能需要nullsLast两次:

 peopleList.sort(Comparator.nullsLast(Comparator.comparing(m -> m.get("last_name"), Comparator.nullsLast(Comparator.naturalOrder())))); 

这应该符合您的要求。

 peopleList.sort((o1, o2) -> o1.get("last_name").compareTo(o2.get("last_name"))); 

如果你想处理空指针尝试这个“旧时尚”的解决方案:

 peopleList.sort((o1, o2) -> { String v1 = o1.get("last_name"); String v2 = o2.get("last_name"); return (v1 == v2) ? 0 : (v1 == null ? 1 : (v2 == null ? -1 : v1.compareTo(v2))) ; }); 

如果您想要null值的第一个或最后一个,请切换1-1

为了彻底,我添加了有用测试用例的生成器:

 Random random = new Random(); random.setSeed(System.currentTimeMillis()); IntStream.range(0, random.nextInt(20)).forEach(i -> { Map map1 = new HashMap(); String name = new BigInteger(130, new SecureRandom()).toString(6); if (random.nextBoolean()) name = null; map1.put("last_name", name); peopleList.add(map1); }); 

您可以覆盖Collection的de compare方法。 这是一个例子: https : //www.mkyong.com/java8/java-8-lambda-comparator-example/

您必须比较对象的last_name,并且不要忘记正确处理null。

 Steps to sort a Map in Java 8. 1]Convert a Map into a Stream 2]Sort it 3]Collect and return a new LinkedHashMap (keep the order) Map result = map.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 

尝试这个:

按键:

 Map result = unsortMap.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 

按价值观:

  Map result = unsortMap.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));