如何以Kotlin风格优雅实现列表合并去重并添加过滤日志?
优雅实现Kotlin书籍列表合并去重并记录过滤ISBN
需求是合并两个Book列表,移除次级列表中与主列表重复的元素(按ISBN判断),同时在有书籍被过滤时记录所有受影响的ISBN。下面是更简洁高效的Kotlin实现:
private fun combineAndDedupe(fromMainSupplier: List<Book>, fromSecondarySupplier: List<Book>): List<Book> { val mainIsbns = fromMainSupplier.map { it.isbn }.toSet() val (secondaryToKeep, secondaryToRemove) = fromSecondarySupplier.partition { it.isbn !in mainIsbns } secondaryToRemove.takeIf { it.isNotEmpty() }?.let { removedBooks -> logger.info("移除主列表已存在的次级供应商书籍:${removedBooks.joinToString(",") { it.isbn }}") } return fromMainSupplier + secondaryToKeep }
优化点说明:
- 提升查找效率:将主列表的ISBN转为
Set,in操作的时间复杂度从O(n)降到O(1),主列表规模较大时优势明显。 - 减少遍历次数:用
partition一次遍历次级列表,同时拆分出需要保留和移除的书籍,避免原实现中多次遍历次级列表的冗余操作。 - 简化条件判断:通过
takeIf+let的组合,仅当存在被移除的书籍时才执行日志逻辑,替代冗长的if块,更符合Kotlin简洁风格。 - 减少中间变量:直接从被移除的书籍集合中提取ISBN,无需额外生成次级列表的ISBN集合和待移除ISBN集合,代码更紧凑。
内容的提问来源于stack exchange,提问作者Martin J.H.
相关产品推荐
相关产品推荐

