如何在Kotlin中对Map的getOrPut返回值进行后续操作?
Kotlin中用map替代forEach处理CSV格式字段
问题描述
我有JavaScript开发背景,刚接触Kotlin。我希望通过map遍历readHeader字符串列表,对row.getOrPut(header) { "" }的返回值执行后续操作:若值包含逗号则用引号包裹,否则直接返回该值。但当前写法返回的是函数类型,我已通过forEach实现需求,想改用map实现。
输入示例
val row = mapOf("firstName" to "John", "lastName" to "Doe", "fruits" to "apple,mango", "column" to "Value") val row1 = mapOf("firstName" to "Jane", "lastName" to "", "fruits" to "banana,grapes", "column" to "Value")
预期输出
John,Doe,"apple,mango",Value Jane,,"banana,grapes",Value
解决方案
你之前的写法返回函数类型,大概率是没正确处理getOrPut的返回值逻辑,或是lambda的位置写错了。用map实现的核心思路是:遍历每个表头字段,对每个字段对应的值做格式化处理,最后拼接成目标字符串。
完整实现代码
val readHeader = listOf("firstName", "lastName", "fruits", "column") fun formatRow(row: Map<String, String>): String { return readHeader.map { header -> val value = row.getOrPut(header) { "" } if (value.contains(",")) "\"$value\"" else value }.joinToString(",") } // 测试调用 val row = mapOf("firstName" to "John", "lastName" to "Doe", "fruits" to "apple,mango", "column" to "Value") val row1 = mapOf("firstName" to "Jane", "lastName" to "", "fruits" to "banana,grapes", "column" to "Value") println(formatRow(row)) // 输出:John,Doe,"apple,mango",Value println(formatRow(row1)) // 输出:Jane,,"banana,grapes",Value
代码说明
readHeader.map { ... }:遍历表头列表,对每个字段对应的value进行格式化,返回一个包含所有格式化后字符串的列表row.getOrPut(header) { "" }:获取当前表头对应的value,如果该表头在row中不存在,则默认返回空字符串joinToString(","):将格式化后的字符串列表用逗号连接,生成符合预期的CSV行格式字符串
内容的提问来源于stack exchange,提问作者wick3d
相关产品推荐
相关产品推荐

