Если мы не заботимся о сохранении исходных исключений, мы можем сделать что-то вроде этого с помощью traverse:
val traversedTries = tries.traverse(Try.applicative(), ::identity)
Это вернет экземпляр типа Try<ListK<String>>
со всеми строками или первымисключение он находит.
ListK
расширяется от List
, но мы можем при желании привести его, добавив .map { it as List<String> }
в конце, если нам нужно, чтобы оно было Try<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()
Предоставив нам два списка с успехомзначения и неудачи соответственно.