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