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) } 
  • No se esperan arguments de tipo para la diversión findViewById (p0: Int): Ver
  • ¿Cómo puedo convertir InputStream en BufferInputStream en kotlin?
  • Objeto Kotlin. ¿Qué forma de initialization es la correcta?
  • Android Studio 3.0 beta2
  • Android Studio Lint comtesting las funciones de order superior de Kotlin
  • Construir un contenedor de grasa ejecutable con gradle-script-kotlin
  • Crea una aplicación de Android escrita en Kotlin usando el sistema de compilation Buck
  • ¿Dónde colocar la fuente generada de java o kotlin cuando se crea un plugin de gradle?
  • ¿Por qué no está vacío en las collections de Kotlin una propiedad?
  • Spring Data JPA / Hibernate "No se puede ubicar Attribute con el nombre de stack"
  • El conflicto de las properties sintéticas de Kotlin