我有一个函数将 A 类型的值映射到一对 (Seq[B], Seq[C])。我想将该函数应用于 A 的序列,并返回一对展平的 Seq[B] 和 Seq[C]。这是代码片段:
val a: Seq[A]
val mapped: Seq[(Seq[B], Seq[C])] = a.map(f)
val (b, c) = mapped.unzip
val bc: (Seq[B], Seq[C]) = (b.flatten, c.flatten)
Run Code Online (Sandbox Code Playgroud)
解决方案是可以接受的,但是有没有更惯用的方法来做到这一点?我虽然关于 for-comprehensions 或 flatMaps,但我不知道如何将它们应用于这对。
我不认为你的代码特别不惯用,但这就是我要写的。请注意,我不相信我的代码比你的更好,我只是折叠的粉丝。
// For testing purposes only, replace with your own code.
val b = List((List(1, 2), List(5, 6)), (List(3, 4), List(7, 8)))
val (l, r) = b.foldLeft((List[Int](), List[Int]())) {(acc, a) =>
(acc._1 ::: a._1, acc._2 ::: a._2)
}
// Prints 'List(1, 2, 3, 4)'
println(l)
// Prints 'List(5, 6, 7, 8)'
println(r)
Run Code Online (Sandbox Code Playgroud)