Android Kotlin:如何根据ObjectB的ID过滤ObjectA列表?
基于ID交集过滤ObjectA列表的实现方案
高效实现(推荐)
先把ObjectB列表里的有效ID提取成Set(Set的查找效率远高于列表),再用这个Set过滤ObjectA:
// 提取ObjectB中所有非空且非空字符串的ID,存入Set val bValidIds = objectBList .mapNotNull { it.id.takeIf { id -> id.isNotEmpty() } } .toSet() // 过滤ObjectA列表,保留ID在bValidIds中的元素 val filteredObjectA = objectAList.filter { objA -> objA.id != null && bValidIds.contains(objA.id) }
简洁链式写法(适合小列表)
如果你的列表元素数量不多,也可以用一行链式调用完成,不过性能略逊于上面的方案:
val filteredObjectA = objectAList.filter { objA -> objA.id?.let { aId -> objectBList.any { objB -> objB.id == aId && objB.id.isNotEmpty() } } ?: false }
关键细节说明
- 处理ObjectA的可空ID:必须先判断
objA.id != null,避免空指针异常 - 排除ObjectB的空ID:ObjectB的id默认是空字符串,所以要过滤掉这类无效ID,避免误匹配
- 性能差异:用Set存储ID的方案,查找时间复杂度是O(1),而直接用
any遍历列表是O(n),数据量大时前者优势明显
内容的提问来源于stack exchange,提问作者Bomatch Eric
相关产品推荐
相关产品推荐

