首页 > 解决方案 > for后如何避免平面图

问题描述

我有以下代码片段:

(for {
  _ <- LiveUserQuery.make(DbManager.failRollback).create(user)
  - <- IO.sleep(2.seconds)
  a <- router.run(Request(GET, uri"/user/d85ec250-bb5c-11ea-b3de-0242ac130030")).value
} yield a).flatMap {
  case Some(req) =>
    req.as[User].map { u =>
      val is_uuid_valid = u.id.compareTo(UUID.fromString("d85ec250-bb5c-11ea-b3de-0242ac130030")) == 0
      expect(is_uuid_valid) && expect(u.gender == "F")
    }
  case None => expect(false)
}

并想避免flatMap之后的for。如何将代码块flatMap移入for?

标签: scalascala-cats

解决方案


您可以使用match表达式:

for {
  _ <- LiveUserQuery.make(DbManager.failRollback).create(user)
  - <- IO.sleep(2.seconds)
  a <- router.run(Request(GET, uri"/user/d85ec250-bb5c-11ea-b3de-0242ac130030")).value
  result <- a match {
    case Some(req) =>
      req.as[User].map { u =>
        val is_uuid_valid = u.id.compareTo(UUID.fromString("d85ec250-bb5c-11ea-b3de-0242ac130030")) == 0
        expect(is_uuid_valid) && expect(u.gender == "F")
      }
    case None => expect(false)
  }
} yield result


推荐阅读