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
相关产品推荐
相关产品推荐

