【问题标题】:Filter two Future[Seq] with for comprehension scala过滤两个 Future[Seq] 用于理解 scala
【发布时间】:2017-09-15 20:59:35
【问题描述】:

我有一些函数返回元组元素列表(Int,Int)和未来。为简单起见,我将定义两个期货

  val f1 = Future {
    List((8, 3), (2, 1), (4, 2), (3, 4))
  }
  val f2 = Future {
    List((2, 3), (5, 1), (7, 9))
  }

我想使用以下标准过滤并获取这两个未来列表中的元素。

在第二个位置包含相同元素的元组

在这种情况下输出应该是

List(((2,1),(5,1)), ((8,3),(2,3))) 

我可以用普通列表(没有期货)来做到这一点,理解如下

val l1 = List((4, 2), (3, 4), (2, 1), (8, 3))
val l2 = List((2, 3), (5, 1), (7, 9))

val o = for {
  a <- l1
  b <- l2 if a._2 == b._2
} yield (a, b)

期货怎么做?

【问题讨论】:

  • “用于压缩”?
  • @pedrofurla 已编辑 -> 理解

标签: scala for-comprehension flatmap


【解决方案1】:

如果您想使用完整的理解,其他解决方案:

val o2 = for {
  l1 <- f1
  l2 <- f2
} yield for {
  a <- l1
  b <- l2 if a._2 == b._2
} yield (a,b)

当然你会在这里有Future,所以你需要等待结果或将它进一步传递给将处理它的东西

【讨论】:

    【解决方案2】:

    另一种可能性是来自 scalaz (although it violates the associative law) 的 ListT monad 转换器:

    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.{Await, Future}
    import scalaz.Scalaz._
    import scalaz._
    import scala.concurrent.duration._
    
    def main(args: Array[String]): Unit = {
      val f1 = Future {
        List((8, 3), (2, 1), (4, 2), (3, 4))
      }
    
      val f2 = Future {
        List((2, 3), (5, 1), (7, 9))
      }
    
      val first = ListT[Future, (Int, Int)](f1)
      val second = ListT[Future, (Int, Int)](f2)
    
      val res = for {
        a <- first
        b <- second if a._2 == b._2
      } yield (a, b)
    
      println(Await.result(res.run, 3 seconds))
    }
    

    【讨论】:

      【解决方案3】:

      Scala 2.12 将zipWith 添加到Future

      f1.zipWith(f2) {
        (l1, l2) => for {
          a <- l1
          b <- l2 if a._2 == b._2
        } yield (a, b)
      }
      

      有关详细信息,请参阅此博客文章:http://viktorklang.com/blog/Futures-in-Scala-2.12-part-2.html

      【讨论】:

        猜你喜欢
        • 2019-05-01
        • 2019-09-23
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 2018-02-27
        • 2022-08-23
        • 2016-01-02
        • 1970-01-01
        相关资源
        最近更新 更多