如何利用map函数基于共同id生成匹配的AccountInfo列表?
问题分析与解决
首先你的写法存在两个核心问题:
- 误用
map方法:map的作用是转换流中元素的类型,而你需要的是保留原AccountInfo对象,仅筛选出符合条件的元素,应该使用filter而非map。 - 方法引用错误:
meetings是List<MeetingsInfo>集合,它并没有getAccountId方法;单个MeetingsInfo对象只有getId()方法,用来获取会议关联的账户ID。
正确实现(基于Stream API)
要实现需求,先把所有会议关联的账户ID提取到一个高效查询的集合中,再过滤账户列表:
// 提取所有会议对应的账户ID到HashSet,O(1)查询效率 Set<String> meetingAccountIds = meetings.stream() .map(MeetingsInfo::getId) .collect(Collectors.toSet()); // 筛选出ID在会议ID集合中的账户 List<AccountInfo> newAccounts = accounts.stream() .filter(account -> meetingAccountIds.contains(account.getId())) .collect(Collectors.toList());
更优化的实现方式
1. 传统循环写法
如果追求极致的底层性能(JIT优化后与Stream差距极小),可以用传统循环,代码可读性稍弱但避免了Stream的底层包装开销:
Set<String> meetingAccountIds = new HashSet<>(); for (MeetingsInfo meeting : meetings) { meetingAccountIds.add(meeting.getId()); } List<AccountInfo> newAccounts = new ArrayList<>(); for (AccountInfo account : accounts) { if (meetingAccountIds.contains(account.getId())) { newAccounts.add(account); } }
2. 提前构建ID集合的必要性
无论用哪种方式,必须先把会议ID存入HashSet,而不是直接在filter中遍历meetings判断ID是否存在——后者的时间复杂度是O(m*n)(m为会议数,n为账户数),而用HashSet的时间复杂度是O(m+n),数据量越大性能差距越明显。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

