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 
  • Deshabilitar la compilation incremental para kapt
  • ¿Por qué el código en una expresión de object puede acceder a variables del ámbito que lo contiene en kotlin?
  • ¿Qué path es mejor si espero usar una syntax como function estática en Kotlin?
  • El uso de datos de Amazon AWS Cognito `.well-known / jwks.json` falla al decodificar base64 algunos campos
  • Creando un nuevo proyecto en Android studio-Kotlin error
  • Kotlin, JPA y campos booleans
  • ¿Cómo recuperar datos de una database de Firebase y almacenarlos en un ListArray <Class>? - Kotlin
  • Argumento de la function Kotlin sin anotación de tipo
  • kapt no resuelve las classs generadas por protobuf
  • TextColor está cambiando a uno incorrecto
  • Companion Objects en Kotlin Interfaces