映射,除非例外

我有一个表示串行化数据的String列表,我想map到一个对象列表。 我使用下面的代码:

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

但是,有时会出现解析错误,而流只是停止,我希望能够恢复列表直到失败。 例如,如果在项目7发生错误,我想doOtherStuff获得成功处理的6个项目。

什么是最习惯的方式来做到这一点? 我可以过滤列表,看看解析是否会成功,但这是一个昂贵的操作正在做两次。

您可以将异常视为null ,然后过滤空值。

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

WhateverException替换为您要处理的错误类型的正确错误,其他错误仍然可以停止处理。

你正在寻找的东西似乎是maptakeWhile的组合。 你可以随时推出自己的。 例如下面是从mapNotNulltakeWhile的来源改编的:

 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 } 

现在,您可以将一个迭代映射到导致null的变换调用,就像Jayson Minard的示例一样 ,您可以将需要的任何异常映射为null

 strings.mapWhileNotNull { try { gson.fromJson(it, Model::class.java) } catch (e: JsonSyntaxException) { null } } // .doOtherStuff