Scala будущее для понимания цепочки будущего и результатов - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу выполнить метод func с каждым вызовом метода, имеющим результат предыдущего и возвращающим окончательное значение метода.

Есть ли способ сделать его менее многословным и динамичным, чтобы, если мне придется делать это более 100 раз, у меня не было 100 строк?

    val a : Future[String] = for {
      comp1Result <- Future { func(shopRequest) }
      comp2Result <- Future { func(comp1Result) }
      comp3Result <- Future { func(comp2Result) }
      comp4Result <- Future { func(comp3Result) }
      comp5Result <- Future { func(comp4Result) }
      comp6Result <- Future { func(comp5Result) }
      comp7Result <- Future { func(comp6Result) }
      comp8Result <- Future { func(comp7Result) }
      comp9Result <- Future { func(comp8Result) }
      comp10Result <- Future { func(comp9Result) }
      comp11Result <- Future { func(comp10Result) }
      comp12Result <- Future { func(comp11Result) }
      comp13Result <- Future { func(comp12Result) }
      comp14Result <- Future { func(comp13Result) }
      comp15Result <- Future { func(comp14Result) }
      comp16Result <- Future { func(comp15Result) }
      comp17Result <- Future { func(comp16Result) }
    } yield {comp17Result }

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Вы можете создать простой хвостовой рекурсивный метод для повторяющейся цепочки Future{ func(result) } через flatMap для заданного числа раз:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

def func(s: String): String = ???

@scala.annotation.tailrec
def loopFutures(future: Future[String], n: Int): Future[String] = n match {
  case 1 => future
  case _ => loopFutures(future.flatMap(r => Future{ func(r) }), n - 1)
}

Например, использовать метод loopFutures для выполненияfor-comprehension:

loopFutures(Future{ func(shopRequest) }, 17)
1 голос
/ 27 сентября 2019

Нет смысла выполнять каждое вычисление в Future, проще выполнить все вычисления в одном Future.Затем можно использовать простую операцию foldLeft:

Future((1 to 17).foldLeft(shopRequest) { case (r, _) => func(r) })

Если вы хотите каждый раз создавать Future, это выглядит так:

(1 to 17).foldLeft(Future.successful(shopRequest)) {
  case (r, _) => r.flatMap(x => Future(func(x)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...