简化代码,除了签名以外,是相同的乐趣(可变参数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的相同函数(由于智能转换,对于StringIntDoubleBoolean不是不同的函数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("...") }