代码之家  ›  专栏  ›  技术社区  ›  Jan Wytze

Scala隔离特定平面图

  •  0
  • Jan Wytze  · 技术社区  · 6 年前

    我有一个 flatMap 我在大约20个地方使用。我相信未来还会有20多个。当 Option 为空。

    示例:

    def get(serverId: UUID, sessionId: UUID) = authAction.async { implicit request =>
      val user = request.user.get
      serverService.findByIdAndUserId(serverId, user.id.get) flatMap { s =>
        if (s.isEmpty) {
          Future.failed(new NotFoundException)
        } else {
          Future.successful(s.get)
        }
      } flatMap { _ =>
        serverSessionService.findByIdAndServerId(sessionId, serverId)
      } flatMap { s =>
        if (s.isEmpty) {
          Future.failed(new NotFoundException)
        } else {
          Future.successful(s.get)
        }
      } map { s =>
        Ok(Json.toJson(s))
      }
    }
    

    我正在做 平面图 对于 选项 在一个控制器方法中检查两次。。。

    如何隔离此部件:

    flatMap { s =>
      if (s.isEmpty) {
        Future.failed(new NotFoundException)
      } else {
        Future.successful(s.get)
      }
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Leo C    6 年前

    下面是一种使用隐式类的方法:

    implicit class OptionFuture[T](f: Future[Option[T]]) {
      def optionFuture(t: Throwable): Future[T] =
        f.flatMap{
          case Some(x) => Future.successful(x)
          case _ => Future.failed(t)
        }
    }
    
    Future{ Some(1) }.optionFuture(new Exception("failed"))
    // Success(1)
    
    Future{ None }.optionFuture(new Exception("failed"))
    // Failure(java.lang.Exception: failed)
    
        2
  •  0
  •   Evgeny    6 年前

    如果为空,我建议将隐式类添加为fail:

    implicit class FutureFailer[T <: Option[_]](f: Future[T]) {
        def failIfEmpty = {
            f.flatMap {
                case None => Future.failed(new NotFoundException)
                case k => Future.successful(k)
            }
        }
    }
    
    Future.successful(Option.empty[String]).failIfEmpty.
        flatMap(_ => Future.successful(Option.empty[String])).failIfEmpty