斯卡拉如何将一种类型的未来转换为另一种类型的未来

时间:2019-05-10 23:39:44

标签: scala

我有一个从数据库检索数据并返回Future [ResponseDTO]类型的函数,然后我需要将其转换为HttpResponse的Future

我的代码:

val responseDTO = database.getResponseDto(service) => Future[ResponseDTO]

responseDTO.onComplete {
   case Success(responseDTO) => HttpResponse(status = responseDTO.responseCode, entity = responseDTO.responsePayload)
   case Failure(exception) => HttpError("error")
}

它不会工作

也尝试过这一点,仍然无法正常工作

responseDTO.map(
  dto => EitherT.pure[Future, HttpError](HttpResponse(status = dto.responseCode, entity = dto.responsePayload))
)

4 个答案:

答案 0 :(得分:5)

使用t = df['Target'].values[:, None] v = df['Value'].values m = v > t m[np.tril_indices(m.shape[1])] = False print (m) [[False False False False True True False False False True] [False False False False True True False False False True] [False False False True True True False False True True] [False False False False True False False False False True] [False False False False False False False False False False] [False False False False False False False False True True] [False False False False False False False False False True] [False False False False False False False False True True] [False False False False False False False False False True] [False False False False False False False False False False]] a = np.argmax(m, axis=1) - np.arange(len(df)) print (a) [ 4 3 1 1 -4 3 3 1 1 -9] df['new'] = np.where(a > 0, a, 0) print (df) Value Target new 0 8 12 4 1 9 12 3 2 10 11 1 3 12 15 1 4 16 19 0 5 13 11 3 6 11 16 3 7 7 11 1 8 12 17 1 9 18 18 0 应该给出您想要的答案:

transform

这将返回成功的responseDTO.transform { case Success(responseDTO) => Success(HttpResponse(status = responseDTO.responseCode, entity = responseDTO.responsePayload)) case _ => Success(HttpError("error")) } ,其结果类型与FutureHttpResponse兼容。

如果要保留有关成功/失败的信息,最好使用HttpError的状态来完成。在这种情况下,您的代码将使用Future的替代版本,如下所示:

transform

然后,您可以在其余代码中使用case class HttpErrorException(err: HttpError) extends Throwable responseDTO.transform( responseDTO => HttpResponse(status = responseDTO.responseCode, entity = responseDTO.responsePayload), _ => HttpErrorException(HttpError("error")) ) 方法来提取FutureHttpResponse

答案 1 :(得分:3)

您想描绘未来。 .onComplete方法不会改变未来,只是增加一个处理程序(对副作用有用)

responseDTO.map(dto => HttpResponse(status=dto.responseCode, entity=dto.responsePayload))

答案 2 :(得分:3)

您需要使用.map来映射成功的将来计算,使用.recover来映射将来的计算期间的异常,并使用Either来获得成功/失败的结果。

    val responseDTO: Future[ResponseDTO] = ... 

    val future: Future[Either[HttpError, HttpResponse]] = 
      responseDTO
        .map(d => Right(HttpResponse(status = d.responseCode, entity = d.responsePayload)))
        .recover {
          case t: Throwable => Left(HttpError("error"))
        }

如果您的类只有一个超类,那么说:

trait Http

case class HttpResponse(...) extends Http

case class HttpError(...) extends Http

您可以避免使用Either

    val future: Future[Http] =
      responseDTO
        .map(d => HttpResponse(status = d.responseCode, entity = d.responsePayload))
        .recover {
          case t: Throwable => HttpError("error")
        }

答案 3 :(得分:-1)

您需要做的是将以前的A类型的未来映射到B类型的新未来,future的onComplete方法会产生副作用,并且仅有助于将回调附加到结果上,并且其方法签名返回Unit。 / p>