Kotlin inteligente echó el segundo valor de un par con filter

Estoy tratando de escribir una function que mapea un String e Int? en un par, luego filtra los valores no nulos del segundo par, antes de continuar con el map.

Mi código se ve así:

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

El problema es que el segundo map tiene el error:

 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> 

Esto parece porque el comstackdor no sabe lanzar mi Iterable<Pair<String, Int?>> Iterable<Pair<String, Int>> después de mi filter . ¿Qué puedo hacer para resolver esto?

El lanzamiento inteligente de Kotlin generalmente no es aplicable fuera de los límites del método. Sin embargo, hay un par de forms en que puedes lograr tu objective de todos modos.

En primer lugar, simplemente puede decirle al comstackdor que el segundo valor del par nunca es nulo usando el !! operador como tal:

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

En segundo lugar, puede invertir el order de filter y map y aplicar el !! operador anterior:

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

¡Finalmente, puedes hacer que funcione sin el !! operador combinando el filtrado y el mapeo en un solo paso usando el método de extensión mapNotNull :

 ids.mapNotNull { id: String -> ints[id]?.let { id to it } } .map { pair: Pair<String, Int> -> func(pair.second) } 
  • Cómo pasar la class kotlin o la instancia de la class kotlin como arguments
  • Kotlin: Interfaz con propiedad inmutable implementada por class con mutable
  • ¿Hay alguna forma de implementar la aplicación del server back-end (Kotlin) en Firebase?
  • Ordenar colección por múltiples campos en Kotlin
  • El complemento "kotlin-noarg" no funciona en el Reino
  • Kotlin arrayList: no se puede reescribir la list
  • Método de ejecución en el object kotlin
  • ¿Cómo establecer el margen inferior a FAB en el layout Anko DSL?
  • UNRESOLVED_REFERENCE Referencia no resuelta: isInitialized
  • La class Kotlin no obtiene su valor boolean de firebase
  • Androide. Mockito usa objects reales en lugar de simulacro