Java 8中如何从HashMap匹配指定多个Key并返回对应字符串
Java 8 实现 HashMap 匹配指定忽略大小写 Key 并返回对应 Key
首先纠正你之前的两个问题:
anyMatch方法返回布尔值,确实不能直接赋值给 String 类型变量;- 你尝试的多条件 Lambda 写法错误,多个判断逻辑应该放在同一个 Lambda 表达式中,不需要重复写
r->。
下面是几种 Java 8 的实现方式,和你 Java 7 代码的逻辑一致,可找到匹配的 Key 并返回:
方式一:直接在 filter 中写判断条件
Map<String, String> filterParamsMap = new HashMap<>(); filterParamsMap.put("CRN", "1234"); // 查找第一个匹配的 Key,返回 Optional<String> 避免空指针 Optional<String> keyOpt = filterParamsMap.keySet().stream() .filter(k -> k.equalsIgnoreCase("CCN") || k.equalsIgnoreCase("PRN") || k.equalsIgnoreCase("PCCN") || k.equalsIgnoreCase("CRN")) .findFirst(); // 若需要和原代码一致,无匹配时 key 为 null String key = keyOpt.orElse(null);
方式二:用目标 Key 集合优化代码(更易维护)
如果后续需要修改目标 Key,这种方式更灵活:
Map<String, String> filterParamsMap = new HashMap<>(); filterParamsMap.put("CRN", "1234"); // 定义目标 Key 集合 Set<String> targetKeys = new HashSet<>(Arrays.asList("CCN", "PRN", "PCCN", "CRN")); Optional<String> keyOpt = filterParamsMap.keySet().stream() .filter(k -> targetKeys.stream().anyMatch(target -> target.equalsIgnoreCase(k))) .findFirst(); String key = keyOpt.orElse(null);
方式三:大小写统一优化性能
如果 Key 数量较多,统一转成小写可以避免多次调用 equalsIgnoreCase,提升效率:
Map<String, String> filterParamsMap = new HashMap<>(); filterParamsMap.put("CRN", "1234"); // 把目标 Key 转成小写存入集合 Set<String> lowerTargetKeys = new HashSet<>(Arrays.asList("ccn", "prn", "pccn", "crn")); Optional<String> keyOpt = filterParamsMap.keySet().stream() .filter(k -> lowerTargetKeys.contains(k.toLowerCase())) .findFirst(); String key = keyOpt.orElse(null);
补充说明
findFirst()会返回第一个匹配的 Key,和你原代码中循环最后一次赋值的逻辑略有不同(原代码会覆盖 key 为最后一个匹配的),如果需要获取最后一个匹配的 Key,可以把findFirst()换成reduce((first, second) -> second),这样会返回最后一个符合条件的元素。- 使用
Optional是 Java 8 推荐的空值处理方式,避免直接返回 null 引发空指针异常,如果你一定要和原代码逻辑完全一致(无匹配时 key 为 null),用orElse(null)即可。
内容的提问来源于stack exchange,提问作者Mira Devi
相关产品推荐
相关产品推荐

