Nie rozumiem, jak mogę nazwać moją funkcją doSomething() na każdym elemencie w for comprehension i zarządzaj z futures z powodu .map tutaj.

Nie jestem pewien, co z dobrym sposobem na to. Czy nie używa for comprehension za pomocą doSomething()?

def myFunc(tion(ids: List[Ids]): Future[MyBean] = {
  for {
    first <- ids.map{ id =>
      myDAO.doSomething(id)
    }
    second <- myDAO.doSomehtingElse(ids)
  } yield {
    MyBean(first, second)
  }
}

def doSomething(id: Id): Future[Long] = Future {...}
def doSomethingElse(ids: List[Id]): Future[Long] = Future {...}
1
Steve 25 grudzień 2019, 20:39

1 odpowiedź

Najlepsza odpowiedź

Po tej linii:

  ids.map{ id =>
      myDAO.doSomething(id)
    }

Otrzymasz listę futures List[Future[A]]. Aby móc złożyć ją z inną przyszłością, musisz przekonwertować go na Future[List[A]]. Aby to osiągnąć, możesz użyć Future.sequence. Możesz także użyć Future.traverse:

Future.traverse(ids)(myDao.doSomething)

W takim przypadku można uniknąć używania map.

Wreszcie można to zrobić zgodnie z następującymi:

  for {
    first <- Future.sequence(ids.map(id => myDAO.doSomething(id)))
    second <- myDAO.doSomehtingElse(ids)
  } yield {
    MyBean(first, second)
  }

Lub:

      for {
        first <- Future.traverse(ids)(myDAO.doSomething)
        second <- myDAO.doSomehtingElse(ids)
      } yield {
        MyBean(first, second)
  }

Należy również pamiętać, że myDAO.doSomehtingElse zostanie nazwany sekwencyjnie - nie równolegle.

2
Nikita Ryanov 25 grudzień 2019, 19:36