Kotlin 箭头将失败列表转换为失败列表
Kotlin arrow transform a List of failures to a Failure of a list
如何转换以下内容:
List<Try<String>>
至:
Try<List<String>>
使用 kotlin 和功能库箭头 (0.8.2)。我想将它包装在自定义异常中。 'String' 中哪一个失败并不重要。
更新:
因为下面的答案就足够了,但我觉得很难读懂。所以,我实施了以下内容:
创建以下函数:
fun getFailedStrings(result: List<Try<String>>): List<Failure> {
return result.fold(
initial = listOf(),
operation = { accumulator, nextUpdate ->
nextUpdate.fold(
ifSuccess = { accumulator },
ifFailure = { accumulator + Failure(it) }
)
})
}
然后使用函数的结果:
return if (failedStrings.isNotEmpty()) {
failedStrings.first() // or whatever fits your usecase
} else {
// strings is the initial result of List<Try<String>>
Success(strings.mapNotNull { it.orNull() })
}
这似乎有效:
fun convert(input: List<Try<String>>): Try<List<String>> =
input.fold(Try.just(emptyList())) { acc, i ->
acc.flatMap { list ->
i.flatMap {
Try.just(list + it)
}
}
}
如果我们不关心保留原始异常,我们可以用遍历做这样的事情:
val traversedTries = tries.traverse(Try.applicative(), ::identity)
这将 return 一个 Try<ListK<String>>
类型的实例,其中包含所有字符串或它找到的第一个异常。
ListK
从 List
扩展而来,但如果我们需要 Try<List<String>>
,我们可以选择在末尾添加 .map { it as List<String> }
来转换它
或者,如果我们想要拆分成功和失败,我们可以创建以下函数:
fun <A> List<Try<A>>.splitSuccessFailure() : Tuple2<List<A>, List<Throwable>> =
fold(emptyList<A>() toT emptyList<Throwable>()) { (successes, failures), it ->
it.fold({ successes toT (failures + it) }, { (successes + it) toT failures })
}
然后,当我们想使用它时,我们可以这样做:
val (successes, failures) = invalidTries.splitSuccessFailure()
给我们两个分别包含成功值和失败值的列表。
如何转换以下内容:
List<Try<String>>
至:
Try<List<String>>
使用 kotlin 和功能库箭头 (0.8.2)。我想将它包装在自定义异常中。 'String' 中哪一个失败并不重要。
更新:
因为下面的答案就足够了,但我觉得很难读懂。所以,我实施了以下内容:
创建以下函数:
fun getFailedStrings(result: List<Try<String>>): List<Failure> {
return result.fold(
initial = listOf(),
operation = { accumulator, nextUpdate ->
nextUpdate.fold(
ifSuccess = { accumulator },
ifFailure = { accumulator + Failure(it) }
)
})
}
然后使用函数的结果:
return if (failedStrings.isNotEmpty()) {
failedStrings.first() // or whatever fits your usecase
} else {
// strings is the initial result of List<Try<String>>
Success(strings.mapNotNull { it.orNull() })
}
这似乎有效:
fun convert(input: List<Try<String>>): Try<List<String>> =
input.fold(Try.just(emptyList())) { acc, i ->
acc.flatMap { list ->
i.flatMap {
Try.just(list + it)
}
}
}
如果我们不关心保留原始异常,我们可以用遍历做这样的事情:
val traversedTries = tries.traverse(Try.applicative(), ::identity)
这将 return 一个 Try<ListK<String>>
类型的实例,其中包含所有字符串或它找到的第一个异常。
ListK
从 List
扩展而来,但如果我们需要 Try<List<String>>
.map { it as List<String> }
来转换它
或者,如果我们想要拆分成功和失败,我们可以创建以下函数:
fun <A> List<Try<A>>.splitSuccessFailure() : Tuple2<List<A>, List<Throwable>> =
fold(emptyList<A>() toT emptyList<Throwable>()) { (successes, failures), it ->
it.fold({ successes toT (failures + it) }, { (successes + it) toT failures })
}
然后,当我们想使用它时,我们可以这样做:
val (successes, failures) = invalidTries.splitSuccessFailure()
给我们两个分别包含成功值和失败值的列表。