Как передать вывод функции во фьючерсах, а затем эти фьючерсы в новую функцию? - PullRequest
0 голосов
/ 27 декабря 2018

Мой сценарий выглядит следующим образом:

Step1: x = def sum(a,b)

Step2: Thread.sleep (1s)

Step3: y = def subtract(a,b)

Step4: Thread.sleep (2s)

Step5: При успешном завершении вышеуказанных шагов выполните z = кратный (x, y)

Мне нужно реализовать этот сценарий с использованием фьючерсовв Скале.Пожалуйста помоги.Я пробовал этот код, но он не работает.

import scala.util.{Failure, Success}
def sum(a:Int ,b:Int) = a+b
def sub(c:Int, d:Int) = c-d
def mul(e: Int, f: Int) = e*f

val Sum1= Future {sum(2,3); Thread.sleep(1000)}

val SumFinal=Sum1.onComplete({
case Success(result) => println(result)
case Failure(e) => println("failed: " + e)
})

val Subt1 = Future {sub(5,3);Thread.sleep(2000)}
val SubtFinal = Subt1.onComplete({
case Success(result) => result
case Failure(e) => println("failed: " + e)
})

val Mul1= mul(SumFinal,SubtFinal)
println(Mul1)

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Проблема с вашим подходом в том, что onComplete возвращает unit.Вот почему вы не получите никакого результата.Итак, в subFimal и sumFinal ничего нет.

scala> def sum(a: Int, b: Int) = Future { a + b }
sum: (a: Int, b: Int)scala.concurrent.Future[Int]

scala> def sub(a: Int, b: Int) = Future { a - b }
sub: (a: Int, b: Int)scala.concurrent.Future[Int]

scala> def mul(a: Int, b: Int) = Future { a * b }
mul: (a: Int, b: Int)scala.concurrent.Future[Int]

scala> for {
     | a <- sum(2,3)
     | b <- sub(10, 7)
     | c <- mul(a, b)
     | } yield c
res0: scala.concurrent.Future[Int] = Future(<not completed>)

scala> res0
res1: scala.concurrent.Future[Int] = Future(Success(15))
0 голосов
/ 27 декабря 2018

Задача 1:

Результатом, например, Future {sub(5,3);Thread.sleep(2000)} является значение, возвращаемое Thread.sleep, то есть () в Scala.Просто измените порядок: Future {Thread.sleep(2000); sub(5,3)} закончится с результатом 2 через 2 секунды.Если вы действительно хотите поставить sleep после вычисления, просто сохраните результат в переменной:

Future {
  val res = sub(5,3)
  Thread.sleep(2000)
  res
}

Задача 2:

SumFinal и SubtFinal снова () потому что это то, что onComplete возвращает.Вместо этого вы можете объединить два фьючерса (или более, или изменить один и т. Д. И т. Д.) и получить будущее в будущем .Один из способов будет (после устранения проблемы 1)

val Mul1 = Sum1.zipWith(Sum2)(mul)
Mul1.onComplete {
  ...
}
...