Kotlin如何返回包含多个send调用的复合lambda?
解决Map转多send调用Lambda的问题
你的代码问题在于forEach循环里的return会直接终止整个函数,导致只处理了第一个匹配类型的元素就返回了对应的Lambda,无法收集所有元素的send调用。
要实现包含所有符合条件元素的send调用的Lambda,可以先收集所有对应的操作,再将它们合并成一个Lambda:
修改后的代码
fun mapToMessage(map: Map<String, Any>?): (Message.() -> Unit)? { if (map.isNullOrEmpty()) { return null } // 收集所有符合类型的send操作 val sendActions = mutableListOf<Message.() -> Unit>() map.forEach { (key, value) -> when (value) { is String -> sendActions.add { send(key, value) } is Int -> sendActions.add { send(key, value) } // 可在此扩展其他需要支持的类型 } } // 如果没有符合条件的操作,返回null;否则返回合并后的Lambda return if (sendActions.isEmpty()) null else { { sendActions.forEach { it() } } } }
代码说明
- 收集操作:用
MutableList存储每个元素对应的send调用Lambda,避免中途返回终止遍历。 - 合并Lambda:最终返回的Lambda会依次执行列表中所有收集到的
send操作,实现你期望的多调用形式。 - 边界处理:保持原逻辑,当Map为空或无符合类型的元素时返回
null。
简化写法(用Kotlin buildList)
fun mapToMessage(map: Map<String, Any>?): (Message.() -> Unit)? { map ?: return null val sendActions = buildList<Message.() -> Unit> { map.forEach { (key, value) -> when (value) { is String -> add { send(key, value) } is Int -> add { send(key, value) } } } } return sendActions.takeIf { it.isNotEmpty() }?.let { actions -> { actions.forEach { it() } } } }
内容的提问来源于stack exchange,提问作者Wafi_ck
相关产品推荐
相关产品推荐

