映射,除非例外
我有一个表示串行化数据的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
替换为您要处理的错误类型的正确错误,其他错误仍然可以停止处理。
你正在寻找的东西似乎是map
和takeWhile
的组合。 你可以随时推出自己的。 例如下面是从mapNotNull
和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 }
现在,您可以将一个迭代映射到导致null
的变换调用,就像Jayson Minard的示例一样 ,您可以将需要的任何异常映射为null
:
strings.mapWhileNotNull { try { gson.fromJson(it, Model::class.java) } catch (e: JsonSyntaxException) { null } } // .doOtherStuff