除了签名(varargs vs map)之外,简化代码相同的代码

时间:2017-08-16 12:26:44

标签: 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
}

1 个答案:

答案 0 :(得分:3)

您可以保留其中一个功能,并以另一种方式让另一个功能调用它:

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

或者,使用spread operator来调用vararg函数:

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

此外,如果p.put(key, value)行都调用接受Any的相同功能(StringIntDouble和{{1}不同由于智能强制转换,您可以用一个{{p>>替换四个Boolean分支

when