如何使用Java 8对地图列表进行排序?
如何使用Java 8对Map
的List
进行排序? 映射包含名为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));
- Java“空白的最终字段可能尚未初始化”Anonymous Interface vs Lambda Expression
- 如何使用不同的包管理Selenium项目代码(如页面对象模型/关键字驱动程序框架)
- 在Apache Tomcat上运行JSF项目
- 如何将子进程stdout / stderr重定向到Java中的主进程stdout / stderr?
- 如何在Java SWT中为TableViewer单元添加工具提示
- Java – 使用Condition和Lambda在Array中查找元素
- 在释放对象和垃圾回收后,Java仍然使用系统内存
- 为什么Java中存在已检查和未检查的exception
- 如何在Tomcat中安排任务