Kotlin如何原地创建仅包含非空值项的Map?
解决Kotlin中创建非空键值对Map的问题
因为postDetails和commentDetails是可空类型,直接访问它们的属性会触发空安全报错,要原地创建只保留非空值的Map,可以用以下两种方式:
方式一:使用buildMap构建器(推荐)
buildMap是Kotlin标准库提供的Map构建函数,能在lambda里直接完成Map的构建,同时处理可空判断:
val myMap: Map<Type, List<Parameter>> = buildMap { // 仅当postDetails非空时,添加POST对应的键值对 request.postDetails?.let { put(Type.POST, it.postParameters) } // 仅当commentDetails非空时,添加COMMENT对应的键值对 request.commentDetails?.let { put(Type.COMMENT, it.commentParameters) } }
这种写法逻辑清晰,后续要加更多键值对时直接在lambda里追加即可,完全不需要额外变量修改。
方式二:用列表过滤后转Map
如果喜欢更简洁的写法,可以先生成包含可空Pair的列表,过滤掉null后转成Map:
val myMap: Map<Type, List<Parameter>> = listOf( request.postDetails?.let { Type.POST to it.postParameters }, request.commentDetails?.let { Type.COMMENT to it.commentParameters } ).filterNotNull().toMap()
这里?.let会在对象非空时生成对应的键值对,否则返回null,filterNotNull会剔除所有null元素,最后toMap()把列表转成Map。
内容的提问来源于stack exchange,提问作者Light Yagami
相关产品推荐
相关产品推荐

