콘텐츠로 이동

2023 07 02

2023-07-02

For Comprehension

  • 개요
    • Scala에서 Future를 다루기 위해서는 flatMap, map, filter를 쓸 수 있다
    • for comprehensionFuture와 함께 쓴다면, 다수의 비동기 Computation을 동시다발적으로 쓸 수 있다
    • for comprehension안에 들어가는 expression 중에서는 Future, List, Option 등이 들어간다
      • 이게 monadic operation으로 뚝딱 해결된다는데...?
  • 코드로 살펴보기 - Future
    def operation1(): Future[Int]
    def operation2(value: Int): Future[String]
    def operation3(value: String): Future[Double]
    
    val result: Future[Double] = for {
      value1 <- operation1()
      value2 <- operation2(value1)
      value3 <- operation3(value2)
    } yield value3
    
    val result2: Future[Double] = operation1().flatMap { value1 =>
      operation2(value1).flatMap { value2 =>
        operation3(value2).map { value3 =>
          value3
        }
      }
    }
    

Future.flatmap() vs Future.onComplete()

  • flatMap()
    • flatMap은 비동기적인 연산을 composing 하는데에 사용된다
    • 여러개의 Future를 체이닝하는 용도
      • for-comprehension도 future의 체이닝!
        def operation1(): Future[Int] = Future.successful(42)
        def operation2(value: Int): Future[String] = Future.successful(s"Hi ${value}")
        
        val result: Future[String] = operation1().flatmap(value => operation2(value))
        
  • onComplete()
    • Future에 대한 콜백메서드를 지정
    • Future가 완료되었을때, 실패했던 성공했던 이걸 실행하도록 지정하는 콜백 메서드
    • Future를 새로 만들진 않고, 그냥 존재하던 Future 어떻게 처리할지를 다뤄
    • Future의 값 자체는 Option[Try[]] 타입이라 이걸 평가하는 것
      def calculateMeaningOfLife: Int = {
        Thread.sleep(2000)
        42
      }
      
      val aFuture = Future {
        calculateMeaningOfLife
      }
      
      println(aFuture.value) // Option[Try[Int]]
      
      aFuture.onComplete {
        case Success(meaningOfLife) => println(s"Success $meaningOfLife")
        case Failure(exception) => println(s"${exception.getMessage}")
      }