gpt4 book ai didi

mongodb - 我应该如何处理 play2 和 Scala 中的 Filter 和 Futures

转载 作者:可可西里 更新时间:2023-11-01 10:01:14 29 4
gpt4 key购买 nike

我正在尝试学习 Futures 和 ReactiveMongo。在我的例子中,我有几个邀请对象,想过滤掉数据库中已经存在的对象。我不想更新或更新数据库中已有的那些。因此我创建了一个过滤方法:

过滤方式:

def isAllowedToReview(invite: Invite): Future[Boolean] = {
ReviewDAO.findById(invite.recoId, invite.invitedUserId).map {
maybeReview => {
maybeReview match {
case Some(review) => false
case None => true
}
}
}
}

DAO:

def findById(rId: Long, userId: Long): Future[Option[Review]] = findOne(Json.obj("rId" -> recoId, "userId" -> userId))

def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = {
collection.find(query).one[T]
}

然后调用:

val futureOptionSet: Set[Future[Option[Invite]]] = smsSet.filter(isAllowedToReview)
save the filtered set somehow...

这不起作用,因为在这种情况下过滤器需要 Invite => Boolean 但我正在发送 Invite => Future(Boolean)。你将如何过滤和保存它?

最佳答案

smsSet.map(sms => isAllowedToReview(sms).map(b => sms -> b)) 类型为 Set[Future[(Invite, Boolean)]] 。您应该能够调用 Future.sequence 将其转换为 Future[Set[(Invite, Boolean)]]。然后你可以收集结果 .map(_.collect{ case (sms, true) => sms}).

因此,将所有内容组合在一起的解决方案可能如下所示:

val futures = smsSet.map(sms => isAllowedToReview(sms).map(b => sms -> b))
val future = Future.sequence(futures)
val result = future.map(_.collect{ case (sms, true) => sms})

当您看到 mapsequence 时,您可以重构为:

val filteredSet = Future.traverse(smsSet){ sms => 
isAllowedToReview(sms).map(b => sms -> b)
}.map(_.collect{ case (sms, true) => sms})

请注意,您可能只想将短信保存在那里,而不是返回集合。但按照我的写法,所有内容都将包装在 Future 中,您仍然可以与其他操作组合。

关于mongodb - 我应该如何处理 play2 和 Scala 中的 Filter 和 Futures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16917914/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com