2016-04-12 4 views
4

Ich versuche, eine Funktion zu schreiben, die einen String und Int? in ein Paar, dann filtert für Nicht-Null-Sekunden-Werte in dem Paar, bevor Sie mit der Zuordnung fortfahren.Kotlin Smartcast den zweiten Wert eines Paares mit Filter

Mein Code sieht wie folgt aus:

val ids: List<String> = listOf("a", "b", "c") 
val ints: Map<String, Int?> = mapOf("a" to 1, "b" to 2, "c" to null) 

ids.map { id: String -> 
    Pair(id, ints[id]) 
}.filter { pair -> pair.second != null}.map { pair: Pair<String, Int> -> 
    func(id, pair.second) 
} 

Das Problem ist, dass die zweite Karte die Fehler hat:

Type inference failed: Cannot infer type parameter T in 
         inline fun <T, R> kotlin.collections.Iterable<T>.map (transform (T) -> R): kotlin.collections.List<R> 

Das sieht aus wie da der Compiler nicht weiß, smart meine geworfen Iterable<Pair<String, Int?>> in eine Iterable<Pair<String, Int>> nach meiner filter. Was kann ich stattdessen tun, um das zu lösen?

Antwort

7

Kotlins Smartcast ist normalerweise außerhalb von Methodengrenzen nicht anwendbar. Es gibt jedoch ein paar Möglichkeiten, wie Sie Ihr Ziel erreichen können.

Erstens können Sie einfach den Compiler sagen, dass der zweite Wert des Paares nie null ist durch Verwendung des !! Operator wie folgt:

ids.map { id: String -> Pair(id, ints[id]) } 
     .filter { pair -> pair.second != null } 
     .map { pair: Pair<String, Int?> -> func(pair.second!!) } 

Zweitens können Sie die Reihenfolge der filter und map umkehren und anwenden die !! Betreiber früher:

ids.filter { id: String -> ints[id] != null } 
     .map { id: String -> id to ints[id]!! } //equivalent to Pair(id, ints[id]!!) 
     .map { pair: Pair<String, Int> -> func(pair.second) } 

Schließlich können Sie es ohne den !! Operator funktioniert durch die Filterung und die Zuordnung in einem Schritt kombinieren wir in der mapNotNull Erweiterungsmethode:

ids.mapNotNull { id: String -> ints[id]?.let { id to it } } 
     .map { pair: Pair<String, Int> -> func(pair.second) } 
Verwandte Themen