简化除签名外具有相同乐趣的代码(varargs vs map)

  • 本文关键字:代码 varargs map vs kotlin
  • 更新时间 :
  • 英文 :


我有一些非常非常相似的代码,我想知道是否有办法简化它?

fun parametersOf(vararg pairs: Pair<String, Any>): Parameters {
val p = Parameters(pairs.size)
for ((key, value) in pairs)
when (value) {
is String  -> p.put(key, value)
is Int     -> p.put(key, value)
is Double  -> p.put(key, value)
is Boolean -> p.put(key, value)
else -> throw BBIllegalOperationException("Unknown type for value:'$value' of key:'$key'")
}
return p
}
fun parametersOf(map: Map<String, Any>): Parameters {
val p = Parameters(map.size)
for ((key, value) in map)
when (value) {
is String  -> p.put(key, value)
is Int     -> p.put(key, value)
is Double  -> p.put(key, value)
is Boolean -> p.put(key, value)
else -> throw BBIllegalOperationException("Unknown type for value:'$value' of key:'$key'")
}
return p
}

你可以让其中一个函数保持原样,并让另一个函数以任一方式调用它:

fun parametersOf(vararg pairs: Pair<String, Any>) = 
parametersOf(pairs.toMap())

或者,使用 spread 运算符调用vararg函数:

fun parametersOf(map: Map<String, Any>): Parameters = 
parametersOf(*map.toList().toTypedArray())

此外,如果p.put(key, value)行都调用接受Any的相同函数(由于智能强制转换,StringIntDoubleBoolean没有不同的函数(,您可以将四个when分支替换为一个:

when (value) {
is String, is Int, is Double, is Boolean -> p.put(key, value)
else -> throw BBIllegalOperationException("...")
}

最新更新