Lambda Map 按中文首字母排序

本文介绍了如何在Java中利用Comparator和Collator的Locale.CHINA特性,配合lambda表达式对Map的entry按照值进行中文排序,并使用LinkedHashMap作为结果容器。
//中文比较器
Comparator<Object> chinese= Collator.getInstance(Locale.CHINA);
//lambda排序生成新map
Map<String, String> sortedMap = subsys.entrySet().stream()
                           .sorted(Map.Entry.comparingByValue(chinese))
                       .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(oldVal, newVal) -> oldVal,LinkedHashMap::new));
Java 中对 `List<Map<String, Object>>` 结构根据多个字段进行排序,可以使用 Java 8 引入的 Lambda 表达式和 `Stream` API 来实现。为了处理多字段排序,需要定义每个字段的比较逻辑,并通过链式调用 `thenComparing()` 方法来组合多个排序条件。 下面是一个完整的示例代码,演示如何对 `List<Map<String, Object>>` 类型的数据按照两个字段进行排序: ### 示例代码 ```java import java.util.*; import java.util.stream.Collectors; public class MapListMultiSort { public static void main(String[] args) { List<Map<String, Object>> dataList = new ArrayList<>(); // 添加测试数据 dataList.add(createMap("张三", 25)); dataList.add(createMap("李四", 30)); dataList.add(createMap("王五", 25)); dataList.add(createMap("赵六", null)); // value 为 null 的情况 dataList.add(createMap("陈七", 35)); // 排序逻辑:先按 value 从大到小排序(null 视为最小值),再按 name 的中文首字母排序 List<Map<String, Object>> sortedList = dataList.stream() .sorted((map1, map2) -> { // 获取 value 值并处理 null 情况 Integer val1 = (Integer) map1.get("value"); Integer val2 = (Integer) map2.get("value"); // 如果 value 相同,则按 name 的中文首字母排序 if (Objects.equals(val1, val2)) { String name1 = (String) map1.get("name"); String name2 = (String) map2.get("name"); return name1.compareTo(name2); } // 如果 value 为 null,则将其排在最后 if (val1 == null) return 1; if (val2 == null) return -1; // 否则按 value 从大到小排序 return Integer.compare(val2, val1); // 逆序 }) .collect(Collectors.toList()); // 输出排序结果 for (Map<String, Object> map : sortedList) { System.out.println(map); } } private static Map<String, Object> createMap(String name, Integer value) { Map<String, Object> map = new HashMap<>(); map.put("name", name); map.put("value", value); return map; } } ``` ### 说明 - **字段提取**:代码中通过 `(Integer) map.get("value")` 和 `(String) map.get("name")` 提取对应的字段值。 - **null 处理**:对于 `value` 字段为 `null` 的情况,将其视为最小值,在排序时排在最后。 - **多字段排序**:通过嵌套的比较逻辑实现了先按 `value` 排序,再按 `name` 排序的功能。 - **流式操作**:使用了 Java 8 的 `Stream` API 进行排序,最终通过 `Collectors.toList()` 收集结果。 该方法可以灵活扩展到更多字段的排序需求,只需在比较器中添加额外的条件判断即可。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值