Kotlin中如何避免重复的空值检查?
解决Kotlin中重复空值检查的几种实用方案
这里有几个简洁的方法可以去掉FilterMovie(movie.name.orEmpty())里的重复空值检查,同时保持代码清晰:
方案1:一步到位的链式转换过滤
直接把从Category到FilterMovie的空值校验和转换合并到一个mapNotNull操作中,省去中间多余的步骤:
private fun filterName(itemList: List<Category>) { val newList = itemList .asSequence() .mapNotNull { category -> // 仅当movie非空且name不为空字符串时,才生成FilterMovie category.movie?.name?.takeIf { it.isNotEmpty() }?.let { FilterMovie(it) } } .toList() }
逻辑很直观:链式调用会自动跳过null值,takeIf又过滤了空字符串,最后只有符合条件的情况才会返回FilterMovie实例,mapNotNull会自动剔除所有null结果。
方案2:用扩展函数封装转换逻辑
如果这个转换逻辑需要在多个地方复用,给Movie类写个扩展函数是个好主意,把空值检查和转换逻辑封装起来:
// 给Movie添加扩展函数,仅当name非空时返回FilterMovie实例 fun Movie.toFilterMovie(): FilterMovie? { return name.takeIf { it.isNotEmpty() }?.let { FilterMovie(it) } } // 过滤函数里直接调用扩展函数 private fun filterName(itemList: List<Category>) { val newList = itemList .asSequence() .mapNotNull { it.movie } // 先过滤掉无movie的Category .mapNotNull { it.toFilterMovie() } // 转换并过滤掉name为空的情况 .toList() }
这样代码职责更清晰,扩展函数可以随时复用,也彻底避免了重复的空值检查。
方案3:简化原有流程的合并写法
如果不想改动太多原有结构,也可以把filterNot和map合并成一个mapNotNull,去掉多余的空值校验:
private fun filterName(itemList: List<Category>) { val newList = itemList .asSequence() .mapNotNull { it.movie } .mapNotNull { movie -> movie.name.takeIf { it.isNotEmpty() }?.let { FilterMovie(it) } } .toList() }
这里用takeIf确保name非空后再构造FilterMovie,mapNotNull会自动过滤掉不符合条件的null结果,不需要再用orEmpty()做兜底。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

