Kotlin:地图创建期间的条件项

问题描述 投票:0回答:4

有没有办法在 Kotlin 中做这样的事情?

mapOf(
   "key1" to var1,
   "key2" to var2,
   if(var3 > 5) "key3" to var3       
)

或者唯一的方法是在创建地图后添加键“key3”? 仅当满足某些条件时,我才想将项目添加到地图中。

syntax kotlin
4个回答
47
投票

一种方法是使用

listOfNotNull(...)
+
.toMap()
并将
null
放在要跳过项目的位置:

val map = listOfNotNull(
   "key1" to var1,
   "key2" to var2,
   if (var3 > 5) "key3" to var3 else null
).toMap()

您还可以使用

.takeIf { ... }
,但请注意,无论条件如何,它都会计算该对,因此如果该对表达式调用函数,则无论如何都会调用它:

val map = listOfNotNull(
    /* ... */
    ("key3" to var3).takeIf { var3 > 5 }
).toMap()

27
投票

更新:Kotlin 1.6 引入了地图生成器 (

buildMap
)。你可以这样使用它:

val map = buildMap<Char, Int>() {
   put('a', 1)
   put('b', 2)
   if(var3 > 5) { put('c', 3) }
}

您可以使用 展开运算符

*
来做到这一点:

val map = mapOf(
   "key1" to var1,
   "key2" to var2,
   *(if(var3 > 5) arrayOf("key3" to var3) else arrayOf())       
)

0
投票

我曾经执行以下操作来有条件地构建地图:

    mutableMapOf(
        "key1" to val1, 
        "key2" to val2, 
        "key3" to val3
    ).also {
        if (condition1) {
            it["key4"] = val4
        }
    }.also {
        if (condition2) {
            it["key5"] = val5
        }
    }.toMap()

允许正弦多个

.also
方法调用,您可以逻辑上拆分定制以增强可读性。


-1
投票

我喜欢使用“构建器”

val map = let {
    val m = HashMap<String, Int>() //use a mutable map as a map builder
    m["key1"] = var1
    m["key2"] = var2
    if(var3 > 5){ m["key3"] = var3 }
    m.toMap()
} //wrapped in a lambda so the builder is inside a private scope and can't accidentally be used

© www.soinside.com 2019 - 2024. All rights reserved.