代码之家  ›  专栏  ›  技术社区  ›  agusgambina

Scala猫Either和foreach

  •  0
  • agusgambina  · 技术社区  · 7 年前

    我正在尝试实现如下代码

    def getUsers: EitherT[Future, String, Response] = {
      for {
        users <- EitherT(userRepository.findAll) // this method would retrieve a Future[Either[String, Seq[User]]]
        user <- users
        friends <- EitherT(userRepository.findFriends(user.id))
      } yield new Response(user, friends)
    }
    

    我明白这是不可能的,因为 EitherT 无法管理 foreach .

    case class User(id: Long, name: String, email: String)
    
    case class Response(user: User, friends: Seq[User])
    

    解决这个问题的好办法是什么?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Lasf    7 年前

    由于您正在查找所有用户,您将有多个用户及其各自的朋友,因此我修改了您的返回值以返回 List 属于 Response

    import cats.data.EitherT
    import cats.syntax.traverse._
    import cats.instances.list._
    import cats.instances.future._
    import scala.concurrent.Future
    
    def getUsers: EitherT[Future, String, List[Response]] = {
      EitherT(userRepository.findAll).flatMap { users =>
        users.toList.traverse(user => EitherT(userRepository.findFriends(user.id)).map(Response(user, _)))
      }
    }
    

    ExecutionContext 在范围或导入中 scala.concurrent.ExecutionContext.Implicits.global