简化代码,除了签名以外,是相同的乐趣(可变参数vs地图)
我有一些非常相似的代码,我想知道是否有一种方法来简化它?
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
的相同函数(由于智能转换,对于String
, Int
, Double
和Boolean
不是不同的函数p.put(key, value)
,则可以用p.put(key, value)
替换四个分支:
when (value) { is String, is Int, is Double, is Boolean -> p.put(key, value) else -> throw BBIllegalOperationException("...") }