Mapeo a less que la exception

Tengo una list de String representan datos serializados que quiero map a una list de objects. Yo uso el siguiente código:

 strings.map { gson.fromJson(it, Model::class.java) } // .doOtherStuff 

Sin embargo, a veces hay un error de análisis y la transmisión simplemente se detiene, me gustaría poder recuperar la list hasta el punto de falla. Por ejemplo, si el error ocurre en el ítem 7, me gustaría que doOtherStuff obtenga los 6 ítems que fueron procesados ​​exitosamente.

¿Cuál es la forma más idiomática de hacer esto? Puedo filtrar la list para ver si el análisis tendrá éxito, pero es una operación costosa que se realiza dos veces.

Puede tratar una exception como null y luego filtrar los nulos.

 val models = modelsInJson.map { json -> try { gson.fromJson(json, Model::class.java) } catch (ex: WhateverException) { // TODO: logging here? null } }.filterNotNull() 

Reemplace WhateverException con la correcta para el tipo de errores que desea manejar, otros errores aún pueden detener el procesamiento.

Lo que estás buscando parece ser una combinación de map y takeWhile . Siempre puedes tirar el tuyo. Por ejemplo, la siguiente es una adaptación de las fonts de mapNotNull y takeWhile :

 inline fun <T, R : Any> Iterable<T>.mapWhileNotNull(transform: (T) -> R?): List<R> { return mapWhileNotNullTo(ArrayList<R>(), transform) } inline fun <T, R : Any, C : MutableCollection<in R>> Iterable<T>.mapWhileNotNullTo(destination: C, transform: (T) -> R?): C { for (element in this) { val transformed = transform(element) if (transformed == null) { break } else { destination.add(transformed) } } return destination } 

Ahora puede asignar una invocación iterable hasta una invocación de transformación que dé como resultado null y, como el ejemplo de Jayson Minard , puede mapear cualquier exception que necesite null :

 strings.mapWhileNotNull { try { gson.fromJson(it, Model::class.java) } catch (e: JsonSyntaxException) { null } } // .doOtherStuff 
  • Cómo establecer no nulo para params de funciones en kotlin
  • Función de queue Kotlin List
  • Detectar events táctiles en superposition y pasarlos más allá
  • Adjuntar fonts al proyecto de biblioteca de kotlin no aparecen en AS
  • kotlin check tipo types incompatibles
  • La cobertura de código de estudio de Android no muestra ninguna class de Kotlin
  • Obtiene N últimos objects emitidos por observables en RxJava2
  • Lea la línea y agregue algo al final
  • ¿Cómo get un KType en Kotlin?
  • No se puede ejecutar el progtwig Kotlin en la terminal
  • My RecyclerView no se notifica adecuadamente