2017-08-16 2 views
2

私は非常に似たようなコードをいくつか持っていますが、単純化する方法があるのだろうかと思っていました。署名(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 
} 

答えて

3

あなたはそれがあるような機能の一つを残して、いずれかの方法で、他はそれを呼び出すことができます:

fun parametersOf(map: Map<String, Any>): Parameters = 
    parametersOf(*map.toList().toTypedArray()) 
vararg関数を呼び出すために spread operatorを使用して、

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

また、p.put(key, value)行がすべて同じ機能を呼び出してAnyを受け入れる場合(Stringの場合はスマートキャストによる、DoubleBoolean、)、あなたは1と4本のwhen枝を置き換えることができます。

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

'PUT'は、この特定の状況では、Javaコードを過負荷になっています。 – ycomp