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

Java8 Stream实现两个列表匹配相同对象并为新列表设置对应ID

实现方案

你可以先把数据库查询到的已有员工列表转换为「手机号-员工ID」的映射表,再遍历请求员工列表完成ID赋值,整体用Stream实现的效率远高于两层for循环,具体代码如下:

第一步:构建手机号到ID的映射

// 构建<phoneNumber, 员工ID>的映射表,O(n)时间复杂度完成
Map<String, Integer> phoneToIdMap = workersOfCompany.stream()
        .collect(Collectors.toMap(
            Person::getPhoneNumber,
            Person::getId,
            // 若存在同手机号重复数据,保留先出现的ID,可根据业务调整合并规则
            (oldId, newId) -> oldId
        ));

第二步:遍历请求列表完成ID赋值,同时拆分更新/插入队列

// 筛选待更新的员工列表,匹配到的员工会自动赋值ID
List<Person> updatableList = requestedWorkers.stream()
        // 匹配到已存在的手机号则赋值ID
        .peek(reqPerson -> Optional.ofNullable(phoneToIdMap.get(reqPerson.getPhoneNumber()))
                .ifPresent(reqPerson::setId))
        // ID不为0即为已存在的待更新员工
        .filter(reqPerson -> reqPerson.getId() != 0)
        .collect(Collectors.toList());

// 筛选待插入的新员工列表
List<Person> insertableList = requestedWorkers.stream()
        .filter(reqPerson -> reqPerson.getId() == 0)
        .collect(Collectors.toList());

说明

  • 该逻辑和你原有基于equals匹配的逻辑完全对齐,前提是你重写的Person.equals()方法仅以phoneNumber作为判断依据
  • 相比原有遍历+contains的实现,映射表的方案将整体时间复杂度从O(n*m)降低到O(n+m),员工数量较多时性能优势更明显

内容的提问来源于stack exchange,提问作者Soulmaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:24:05