Scala для понимания результата работы с картой прибывает как Int
Пожалуйста, посмотрите на приведенный ниже код,
`
val d= for{
t <- db.getSomething()
ids <- t.map(_.id).toSeq
histo <- fetchOtherRelatedDetails(ids)
} yield histo
`
Здесь db.getSomething возвращает Future[Seq[SomeObject]], поэтому я пытаюсь извлечь объект и затем отобразить его идентификаторы в список, а затем хочу вызвать другую функцию, которая обработает идентификаторы для получения результата в Future. Проблема с компилятором заключается в ids
как Int, который должен быть Seq[Int]
Я делаю что-то неправильно?
1 ответ
На первый взгляд, у вас есть несоответствие типов для понимания:
for {
t <- db.getSomething()
ids <- t.map(_.id).toSeq
histo <- fetchOtherRelatedDetails(ids)
} yield histo
это desugars для
db.getSomething().flatMap { t =>
t.map(_.id).toSeq.flatMap { ids =>
//^_______________________^
// the return type of this expression is Seq[A], but Future[A] is expected
fetchOtherRelatedDetails(ids).map(histo => histo)
}
}
Как отмечено в строке, вы не можете вернуть Seq
где Future
ожидается. Другими словами, все выражение справа от <-
должен иметь общий "контейнер" (Future
в данном случае) для проверки на проверку типов.
В этом конкретном случае вы можете исправить это с помощью назначения вместо flatMap
(<-
)
for {
t <- db.getSomething()
ids = t.map(_.id).toSeq
histo <- fetchOtherRelatedDetails(ids)
} yield histo