如何将Kotlin的List<Result<T>>类型转换为Result<List<T>>?
如何将List<Result>转换为Result<List>(遇首个失败即终止)
核心思路是遍历列表逐个校验Result状态,一旦遇到失败结果就立即终止处理并返回该失败;若全部为成功结果,则将所有成功值收集后包装为成功结果返回。
Java 实现示例
首先定义简化的Result密封接口(适配常见的成功/失败模型):
import java.util.ArrayList; import java.util.List; import java.util.Optional; sealed interface Result<T> permits Result.Success, Result.Failure { record Success<T>(T value) implements Result<T> {} record Failure<T>(Throwable error) implements Result<T> {} default boolean isSuccess() { return this instanceof Success; } default Optional<Throwable> getFailure() { return this instanceof Failure<?> f ? Optional.of(f.error()) : Optional.empty(); } default Optional<T> getValue() { return this instanceof Success<T> s ? Optional.of(s.value()) : Optional.empty(); } }
转换方法实现:
public static Result<List<String>> convertToResultList(List<Result<String>> input) { List<String> successValues = new ArrayList<>(); for (Result<String> result : input) { if (result.isSuccess()) { successValues.add(result.getValue().orElseThrow()); } else { // 遇到第一个失败,直接返回该失败结果 return new Result.Failure<>(result.getFailure().orElseThrow()); } } // 全部成功,返回包装后的成功结果 return new Result.Success<>(successValues); }
Kotlin 实现示例
Kotlin的密封类语法更简洁,实现如下:
sealed class Result<out T> { data class Success<out T>(val value: T) : Result<T>() data class Failure(val error: Throwable) : Result<Nothing>() } fun List<Result<String>>.toResultList(): Result<List<String>> { val successList = mutableListOf<String>() for (result in this) { when (result) { is Result.Success -> successList.add(result.value) is Result.Failure -> return result // 首个失败直接返回,终止处理 } } return Result.Success(successList) }
关键逻辑说明
- 遍历过程中短路处理失败:一旦发现
Failure实例,立即终止遍历并返回该失败结果,避免不必要的后续处理 - 成功结果的收集:仅当所有元素均为
Success时,才将所有成功值汇总为List<String>,并包装为Result.Success返回
内容的提问来源于stack exchange,提问作者Vencat
相关产品推荐
相关产品推荐

