如何用Java Streams结合ifPresentOrElse()过滤两个Map列表并获取名称?
基于Stream实现双列表按age查找name
第一步:修正原初始化代码的错误
原代码存在两处逻辑错误,修正后的完整初始化代码如下:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { // 初始化list1 Map<String, String> map1 = new HashMap<>(); map1.put("age", "30"); map1.put("name", "john"); Map<String, String> map2 = new HashMap<>(); map2.put("age", "31"); // 修正:原代码误用map1调用put,改为map2 map2.put("name", "marry"); List<Map<String, String>> list1 = new ArrayList<>(); list1.add(map1); list1.add(map2); // 初始化list2 Map<String, String> map3 = new HashMap<>(); map3.put("age", "40"); // 修正:原代码误用map1调用put,改为map3 map3.put("name", "mike"); Map<String, String> map4 = new HashMap<>(); map4.put("age", "41"); // 修正:原代码误用map1调用put,改为map4 map4.put("name", "terry"); List<Map<String, String>> list2 = new ArrayList<>(); list2.add(map3); // 修正:原代码向list1添加元素,改为向list2添加 list2.add(map4); // 测试查找 System.out.println(findNameByAge("40", list1, list2)); // 输出mike System.out.println(findNameByAge("30", list1, list2)); // 输出john System.out.println(findNameByAge("50", list1, list2)); // 输出null } }
第二步:用Stream实现查找逻辑
推荐使用Optional.or()方法串联两个列表的查找流,代码简洁且符合Stream的函数式风格:
public static String findNameByAge(String targetAge, List<Map<String, String>> list1, List<Map<String, String>> list2) { // 优先查找list1,未找到则查找list2 return list1.stream() .filter(map -> targetAge.equals(map.get("age"))) .findAny() // list1无匹配时,执行list2的查找流 .or(() -> list2.stream() .filter(map -> targetAge.equals(map.get("age"))) .findAny()) // 提取匹配元素的name,无匹配则返回null .map(map -> map.get("name")) .orElse(null); }
逻辑说明
- 对list1创建流,过滤出
age等于目标值的元素,用findAny()返回Optional<Map> - 调用
or()方法,传入一个Supplier:当list1的Optional为空时,执行list2的查找逻辑 - 用
map()提取匹配Map中的name字段,最后用orElse(null)处理无匹配的情况(可根据需求改为返回空字符串等默认值)
若坚持使用ifPresentOrElse结构
如果要基于你给出的ifPresentOrElse结构实现,可以通过数组存储结果(lambda无法修改外部局部变量):
public static String findNameByAge(String targetAge, List<Map<String, String>> list1, List<Map<String, String>> list2) { String[] result = new String[1]; list1.stream() .filter(map -> targetAge.equals(map.get("age"))) .findAny() .ifPresentOrElse( // list1找到匹配,提取name map -> result[0] = map.get("name"), // list1未找到,遍历list2查找 () -> list2.stream() .filter(map -> targetAge.equals(map.get("age"))) .findAny() .ifPresent(map -> result[0] = map.get("name")) ); return result[0]; // 无匹配返回null }
内容的提问来源于stack exchange,提问作者stackmj18
相关产品推荐
相关产品推荐

