Упрощение кода, который является одинаковым удовольствием, за исключением подписи (varargs vs map)

У меня есть очень очень похожий код, и мне было интересно, есть ли способ его упростить?

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()) 

Или, используя оператор распространения для вызова функции vararg :

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

Кроме того, если p.put(key, value) вызывают одну и ту же функцию, принимающую Any (не разные для String , Int , Double и Boolean , из-за умных приведений), вы можете заменить четыре, when ветви на единицу:

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