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 usar @DbEnumValue con Ebean en Kotlin?
  • ¿Kapt es compatible con Maven?
  • La sobrecarga es igual a BigDecimal en Kotlin
  • ¿Por qué tengo que devolver Unit.INSTANCE al implementar en Java una function Kotlin que devuelve una Unidad?
  • Kotlin - ¿Utilidad de las properties var "computadas"?
  • StackOverflowError con Singleton en Kotlin
  • Error de reference sin resolver en copyOfRange
  • Float es un campo no válido para la comparación de Realm
  • Transformación de Kotlin de objects a otros objects
  • ¿Qué significa / significa la tumba en Kotlin?
  • Escuchar posts y escribir commands en un flujo observable