You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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);
}

逻辑说明

  1. 对list1创建流,过滤出age等于目标值的元素,用findAny()返回Optional<Map>
  2. 调用or()方法,传入一个Supplier:当list1的Optional为空时,执行list2的查找逻辑
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:45:55