繁体   English   中英

Scala Cats EitherT和foreach

[英]Scala Cats EitherT and foreach

我正在尝试实现以下代码

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])

哪个是解决此问题的好方法?

由于您正在查找所有用户,因此您将有多个用户及其各自的朋友,因此我修改了您的返回值以改为返回Response List 然后,也许您想做这样的事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM