You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Kotlin Arrow重构嵌套when代码为函数式风格并处理异常?

重构Arrow Either嵌套结构与函数式异常处理

问题背景

我在重构函数时遇到困难,希望将嵌套的when-is结构改为使用Left=ErrorCodes的顺序映射/聚合的函数式写法,同时想了解如何以函数式方式添加try-catch块。当前使用Arrow 1.2.0-RC版本,也可接受降级。

原代码如下:

when(val maybeValid = ValidInput.create(uncheckedInput)) {
    is Either.Right -> {
        val validInput = maybeValid.value
        when(val maybeResult = Result.create(validInput)) {
            is Either.Right -> {
                TRY/CATCH, RETURN LEFT ON CATCH, RESULT ON RIGHT
            }
            is Either.Left -> { RETURN LEFT })) }
        }
    }
    is Either.Left -> maybeValid.leftOrNull()!!.map { RETURN LEFT }
}

之前仅将Either当作高级元组使用,现在希望按其设计初衷聚合结果,对Arrow的工具集有些困惑。


解决方案

1. 用Arrow链式API替换嵌套when结构

Arrow的Either核心就是通过flatMap、map等方法实现错误的自动传递与聚合,完全可以替代嵌套分支判断。你的业务逻辑是验证输入 → 生成结果 → 处理异常,用链式调用可以完美串联:

ValidInput.create(uncheckedInput)
    // 验证通过后,生成Result(Result.create返回Either)
    .flatMap { validInput -> Result.create(validInput) }
    // 处理Result,同时捕获异常
    .flatMap { result ->
        // 函数式捕获异常:成功返回Right,失败返回Left(Throwable)
        Either.catch {
            // 这里写原TRY块中处理result的逻辑
            processResult(result)
        }
        // 将捕获到的Throwable转换为自定义的ErrorCodes
        .mapLeft { throwable -> ErrorCodes.fromThrowable(throwable) }
    }

2. 关键API解析

  • flatMap: 用于从Either.Right转换到另一个Either类型,自动传递Left错误分支,无需手动处理is Either.Left的情况。
  • Either.catch: Arrow提供的函数式异常处理工具,包裹可能抛出异常的代码块,自动将异常包装为Left,成功结果包装为Right。
  • mapLeft: 用于将Left中的值转换为自定义类型(这里把Throwable转成ErrorCodes),统一错误格式。

3. 代码简化优化

如果Result.create可以直接作为方法引用传递,代码可以更简洁:

ValidInput.create(uncheckedInput)
    .flatMap(::Result.create)
    .flatMap { result ->
        Either.catch { processResult(result) }
            .mapLeft(ErrorCodes::fromThrowable)
    }

4. 版本兼容性说明

Arrow 1.2.0-RC中的Either.catch、flatMap等API都是稳定可用的,无需降级。建议深入理解Either的错误聚合设计,避免再把它当作普通元组使用,充分发挥函数式错误处理的优势。


内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:02:40