Изменить значение внутри будущего (успех (некоторые (список (BN))) - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть класс

case class BN[A] (val BNId: Long, score: Double, child: A) 

и база данных как BnDAO

class BnDAO(...) {
  def readAsync(info : scala.Long)(implicit ec : scala.concurrent.ExecutionContext) : scala.concurrent.Future[scala.Option[scala.List[BN]]] = { /* compiled code */ }
}

Во время моей функции вызова BnDAO для получения BN для набора идентификаторов я хочу изменитьрезультат BN в соответствии с Map[InfoId: Long, score: Double]

Вот мой текущий код

val infoIds = scoreMap.keys.toSet
val futureBN = infoIds.map {
      id =>
        val curBN = interestsDAO.readAsync(id)
//curBN is now "Future(Success(Some(List(BN))))"
        val curScore = scoreMap.get(id)
        //how to change curBN's score with curSocre?
    }

Спасибо !!

// Спасибо за ответ Аллена.На основании его ответа.Можно ли создать Набор будущего [Опция [Список [BN]]] и Карта Длинного для Списка [Длинный] (infoId -> Список [BNId]) в пределах одного хода.

1 Ответ

0 голосов
/ 20 сентября 2019

Я не был уверен, что вы имели в виду, поэтому я создал два ответа.Выберите тот, который вы хотите.

import scala.concurrent.duration._
val ids = scoreMap.keys.toVector
val futureBN = ids.map { id =>
  val curBNFut = interestsDAO.readAsync(id)
  val v = curBNFut.map(opt => opt.map(l => 
    id -> l.map(e =>
      scoreMap.get(e.id).map(escore => e.copy(score = escore)).getOrElse(e)
    )
  )
}
val mapResultFut = Future.sequence(futureBN).map(m =>
  m.flatMap(identity).toMap
)
val mapResult = Await.result(mapResultFut, 5.seconds)
val setFut = futureBN.map(fut => fut.map{opt => opt.map{case (id, l) => l }}).toSet

или

import scala.concurrent.duration._
val ids = scoreMap.keys.toVector
val futureBN = ids.map { id =>
  val curBNFut = interestsDAO.readAsync(id)
  val v = curBNFut.map(opt => opt.map(l => 
    id -> l.map(e =>
      scoreMap.get(id).map(escore => e.copy(score = escore)).getOrElse(e)
    )
  )
}
val mapResultFut = Future.sequence(futureBN).map(m =>
  m.flatMap(identity).toMap
)
val mapResult = Await.result(mapResultFut, 5.seconds)
val setFut = futureBN.map(fut => fut.map{opt => opt.map{case (id, l) => l }}).toSet

Разница во входных данных для ScoreMap.get

Я не уверен, какой вы хотите.

Оставьте комментарий, если что-то не так.Не забудьте проверить мой ответ, так что это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...