如何解决Either<ClientError, List<Employee>>遍历报迭代器错误
报错原因
A()的返回值Either<ClientError, List<Employee>>是函数式风格的结果包装类型(常见于Arrow库),本身不是集合类型:
- Left分支承载错误类型
ClientError,代表逻辑执行失败 - Right分支承载成功结果
List<Employee>,才是你需要的员工列表集合
你直接对Either包装类型做for循环遍历,编译器找不到该类型对应的迭代器实现,就会抛出"for loop must have iterator"错误。
另外你给变量命名为employeeList本身有歧义,它存的不是List,是Either包装结果,建议调整命名避免后续混淆。
解决方法
核心思路是先对Either做解包,拿到内部实际的List<Employee>类型后再遍历,常用处理方式有3种:
- 分支全量处理(最推荐,符合类型安全要求)
用when表达式对两种分支做分别处理,不会遗漏错误场景:
// 调整变量名,明确它是结果包装对象,不是直接的列表 val employeeResult = A() when (employeeResult) { is Either.Left -> { // 此处处理错误逻辑,比如打印日志、返回业务提示 val clientError = employeeResult.value handleFetchError(clientError) } is Either.Right -> { // 此处拿到的value才是真正的员工列表,可直接遍历 val employeeList = employeeResult.value for (e in employeeList) { // 写你的遍历业务逻辑 } } }
- 简化处理:错误场景返回null后判空遍历
如果不需要精细处理错误逻辑,可以用Either提供的安全取值方法,拿到列表后判空遍历:
// getOrNull会在Left错误分支返回null,Right分支返回实际列表 val employeeList = A().getOrNull() if (employeeList != null) { for (e in employeeList) { // 遍历逻辑 } }
注意:不要直接调用无安全保护的
getOrThrow()方法,错误分支下该方法会直接抛出异常,未做前置判断容易引发崩溃。
- 链式函数式处理
如果习惯用函数式链式写法,可以直接用Either的扩展方法处理,不需要手动解包:
A() .onLeft { error -> // 处理错误逻辑 handleFetchError(error) } .onRight { employeeList -> // 只有成功分支会进入此处,可直接遍历列表 for (e in employeeList) { // 遍历逻辑 } }
内容的提问来源于stack exchange,提问作者user14531552
相关产品推荐
相关产品推荐

