【发布时间】:2021-12-13 16:16:19
【问题描述】:
def getCommentIds(
commentTargetId: Long,
sortOrder: CommentOrderEnum): Future[Seq[CommentStatsBO]]
def getCommentDetail(commentId: Long): Future[Option[CommentDetailDTO]]
def getCommentListWithDetail(
targetId: Long,
sortOrder: CommentOrderEnum,
page: Int): Future[Seq[CommentDetailDTO]] = {
commentModel.getCommentIds(targetId, sortOrder).flatMap {
commentStatsBOSeq =>
Future.traverse(commentStatsBOSeq) { commentStatsBO =>
// commentDetail is a Future[Option[T]]
val commentDetail = getCommentDetail(commentStatsBO.iId)
commentDetail.map(commentOpt =>
commentOpt
// merge the stat info into the comment detail
.map(_.copy(replyCount = Some(commentStatsBO.replyCount)))
.getOrElse(CommentDetailDTO))
}
}
}
case class CommentDetailDTO(
id: Long,
author: JsObject,
detail: CommentDetail,
replyCount: Option[Int] = None
)
首先,函数getCommentIds返回一个CommentStatsBO序列,然后遍历它并尝试获取每个评论的详细信息。问题来了,getCommentDetail 返回一个 Future ,其中包含一个选项,因为可能找不到评论,在这种情况下,如何过滤那些选项为 None 的?我试过getOrElse ,但不知道如何定义一个像Json.obj() 一样的空对象,因为case class 不支持。
谢谢!
【问题讨论】:
-
顺便说一句,未来的相遇选项会变成悲剧。现在我发现 scala 的未来对程序员来说仍然很详尽。