繁体   English   中英

如何从 Kotlin 中的一组可为空的项目中创建具有非空值的 Map?

[英]How can I create a Map with non-null values from a set of nullable items in Kotlin?

在 Kotlin 代码中,我想像这样向 map 添加两个字段:

val myMap: Map<Type, List<Parameter>> = mapOf(
    Pair(Type.POST, request.postDetails.postParameters),//postDetails can be nullable
    Pair(Type.COMMENT, request.commentDetails.commentParameters)//commentDetails can be nullable
)

上面的代码在postDetails.postParameterscommentDetails.commentParameters显示错误,因为它们可以为空。

如何像这样就地创建map而不是创建变量并更新它,我只想在值不是null的情况下保留该对?

我会为它编写自己的工厂方法,然后调用这些方法。

fun <K, V> mapOfNullableValues(vararg pairs: Pair<K, V?>): Map<K, V> =
    pairs.mapNotNull { (k, v) ->
        if (v != null) k to v else null
    }.toMap()

fun <K, V> mutableMapOfNullableValues(vararg pairs: Pair<K, V?>): MutableMap<K, V> =
    pairs.mapNotNull { (k, v) ->
        if (v != null) k to v else null
    }.toMap(mutableMapOf())

通过编写自己的工厂方法,您可以使用Pair数组,这比就地修改使用站点要容易得多。

请注意,与内置构建器相比,这些方法会创建一个额外的列表。

我发现没有添加大量额外代码的一种方法是在null的情况下添加代码以添加emptyList并稍后删除它们。

像这样的东西:

val myMap: Map<Type, List<Parameter>> = mapOf(
    Pair(Type.POST, request.postDetails?.postParameters ?: listOf()),
    Pair(Type.COMMENT, request.commentDetails?.commentParameters ?: listOf())//commentDetails can be nullable
).filter{ it.value.isNotEmpty() }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM