Kotlin如何正确过滤列表无效值实现逐行打印有效元素
Kotlin列表有效条目逐行打印问题
问题场景
Kotlin开发中处理Event对象列表,需求为逐行打印列表内的有效条目,剔除空行、内容为字面量"null"的无效行,初始实现及第一次过滤修改均未得到符合预期的结果。
初始实现代码(StringPrint.kt)
fun main() { val newString = createData().joinToString("\n") { "${it.title?: ""} ${it.status?: ""}".trim() } println(newString) } data class Event(val title: String? = null, val status: String? = null) fun createData() = listOf( Event("text 1", "abc"), Event("text 2", "abc"), Event("text 3", "abc"), Event("text 4", "abc"), Event("", null), Event(null, ""), Event(null, "3"), Event("null", ""), Event("456", "89") )
初始运行输出
text 1 abc text 2 abc text 3 abc text 4 abc (空白行) (空白行) 3 null 456 89
初始输出存在两类需要剔除的无效内容:由空值/空字符串拼接生成的空白行、内容为"null"的无效行。
预期输出
text 1 abc text 2 abc text 3 abc text 4 abc 3 456 89
第一次修改的问题
第一次修改使用的过滤逻辑如下:
val newString = createData() .filterNot { it.title.isNullOrBlank() || it.status.isNullOrBlank() } .joinToString("\n") { "${it.title?: ""} ${it.status?: ""}".trim() } println(newString)
该逻辑的错误点在于过滤规则设置不合理:要求title和status两个字段同时非空、非空白,会误过滤Event(null, "3")这类仅单个字段有效的合法条目,同时也没有处理title值为字面量"null"的无效场景,运行后丢失了3这条有效内容。
正确实现方案
过滤逻辑不需要提前判定单个字段是否合法,直接对每个条目转换后的最终打印字符串做校验即可,从根源避免单字段判定的误判问题,代码如下:
fun main() { val newString = createData() // 先将每个对象转换为trim后的最终打印字符串 .map { "${it.title ?: ""} ${it.status ?: ""}".trim() } // 过滤规则:非空白,且内容不等于字面量"null" .filter { it.isNotBlank() && it != "null" } // 拼接换行符输出 .joinToString("\n") println(newString) } data class Event(val title: String? = null, val status: String? = null) fun createData() = listOf( Event("text 1", "abc"), Event("text 2", "abc"), Event("text 3", "abc"), Event("text 4", "abc"), Event("", null), Event(null, ""), Event(null, "3"), Event("null", ""), Event("456", "89") )
运行上述代码即可得到完全符合预期的输出。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

