【问题标题】:Scala transforming a Seq with FutureScala 用 Future 改造 Seq
【发布时间】:2015-09-28 19:46:44
【问题描述】:

我有一个元组的Seq,看起来像这样:

Seq[(Future[Iterable[Type1]], Future[Iterator[Type2]])]

我想将其转换为以下内容:

Future[Seq([Iterable[Type1], [Iterable[Type2])]

这可能吗?

【问题讨论】:

    标签: scala future


    【解决方案1】:

    这应该可以解决问题

    val a: Seq[(Future[Iterable[Type1]], Future[Iterable[Type2]])] = ...
    
    val b: Future[Seq[(Iterable[Type1], Iterable[Type2])]] = Future.sequence(a.map{
      case (l, r) => l.flatMap(vl => r.map(vr => (vl, vr)))
    })
    

    【讨论】:

      【解决方案2】:

      比 Till Rohrmann 的回答简单一点。未经测试,但应该可以工作。

      val seq: Seq[(Future[Iterable[Type1]], Future[Iterable[Type2]])] = ...
      
      val seq2 = Future.traverse(seq) { case (f1, f2) => f1.zip(f2) } 
      

      或者

      val seq1 = seq.map { case (f1, f2) => f1.zip(f2) } 
      // Seq[Future[(Iterable[Type1], Iterable[Type2])]]
      
      val seq2 = Future.sequence(seq1)
      // Future[Seq([Iterable[Type1], [Iterable[Type2])]
      

      如果您确实有Iterator[Type2],如问题所示,请使用f2.map(_.toIterable) 而不仅仅是f2

      【讨论】:

      • traverse 更好,因为它不会创建中间集合。不错的答案。
      猜你喜欢
      • 2019-12-13
      • 1970-01-01
      • 2018-02-27
      • 2019-09-23
      • 1970-01-01
      • 2018-02-17
      • 2020-07-16
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多