如何将Cats EitherT[Future, IllegalStateException, Result]转换为Future[Result]
实现方案
你可以直接通过Cats EitherT内置的API完成转换,不需要手动拆包.value处理中间结果:
方案1:使用rethrowT(推荐,Cats 2.0+ 版本支持)
只要你的EitherT左值属于Throwable子类(你场景里的IllegalStateException满足要求),且容器类型Future存在MonadError[Future, Throwable]实例(Scala标准库的Future默认由Cats提供该实例),直接调用rethrowT即可一步完成转换:
import cats.implicits._ val resultT: EitherT[Future, IllegalStateException, Result] = ??? val resultF: Future[Result] = resultT.rethrowT
遇到左值时该方法会自动将对应的异常抛入Future的失败状态,右值则直接返回成功状态的Future,和你手动拆.value再转换的效果完全一致。
方案2:使用foldF(兼容旧版本Cats)
如果你使用的Cats版本低于2.0没有提供rethrowT,可以用foldF方法实现等价逻辑,写法同样比手动拆包简洁:
import scala.concurrent.Future val resultF: Future[Result] = resultT.foldF(Future.failed, Future.successful)
foldF会将左值传入第一个函数生成失败的Future,右值传入第二个函数生成成功的Future,直接得到你需要的Future[Result]类型。
内容的提问来源于stack exchange,提问作者FrancMo
相关产品推荐
相关产品推荐

