当前位置: 首页 > 知识库问答 >
问题:

过滤两个未来[Seq]与理解 Scala

步兴德
2023-03-14

我有一些函数返回带有未来的元组元素列表(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)

如何与期货一起做?

共有3个答案

陈成济
2023-03-14

Scala 2.12为< code >未来增加了一个< code>zipWith:

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

暴向笛
2023-03-14

另一种可能是scalaz的<code>ListT</code>monad transformer(尽管它违反了关联法则):

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))
}
竺辉
2023-03-14

额外的解决方案,如果你想使用完整的理解:

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

当然你会有未来在这里所以你需要等待结果或通过它进一步的东西将处理它

 类似资料:
  • 我试图使用以下公式将Future[Seq[(String,String)]转换为Future[Seq[(String)]: 所以 sortedSeq 是 Future[Seq[(String, String)]] 但我一直得到错误: 我做错了什么?

  • 问题内容: 我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。 我的代码如下所示: 但是后来我想,这样写会更好吗? 它更具可读性,并且如果需要性能,则可以取出以获得某些东西。 问题是:使用第二种方法是否有任何警告?有任何性能差异吗?我是否完全想念,应该以另一种方式来做到这一点(例如,使用而不是)吗? 问题答案: 我发现列表理解比 清晰得多,但请使用任何你更容易理解

  • 我有一个名为Source的类,它有lazy val isValid来做一些需要时间的网络检查。我让它返回Future[Boolean],这样它就不会阻塞主线程: 现在,我想检查几个来源并丢弃无效的来源。 下面是一些伪代码: 我在想一些方法,可以将从isValid返回的Future[Boolean]转换为其他将来,在验证检查完成后,可以使用整个源对象进行解析。 最好的方法是什么?

  • AngularJS过滤器用来格式化输出给用户的数据。除了格式化数据,过滤器还能修改DOM。这使得过滤器通常用来做些如“适时地给输出加入CSS样式”等工作。 比如,你可能有些数据在输出之前需要根据进行本地化。你可以向下面这样使用链式的过滤器来传递表达式: name | uppercase 这个表达式执行时会将name的值传递给uppercase过滤器。

  • 我正在阅读Scala Cookbook(http://shop.oreilly.com/product/0636920026914.do) 有一个与未来使用相关的例子,涉及理解。 到目前为止,我对理解的理解是,当与一个集合一起使用时,它会产生另一个相同类型的集合。例如,如果每个< code>futureX的类型为< code>Future[Int],则以下内容也应为< code>Future[In