我正试图在scala上压平以下结构:
Array[((String, String, String),(String, String, String))]
获取:
(String, String, String, String, String, String)
到目前为止,我尝试了类似的东西:
val = payload.map(_.productIterator.toList.map(_.toString)).toList
产生:List[List[String]]
关于如何实现这一点,有什么想法吗?
谢谢!
元组不是一种可以轻易扁平化的东西——Scala 3提供了连接它们的方法:
val xs: Array[((String, String, String),(String, String, String))]
xs.map { case (t1, t2) =>
t1 ++ t2
} // Array[(String, String, String, String, String, String)]
但在Scala 2中,您必须手动组合它们
val xs: Array[((String, String, String),(String, String, String))]
xs.map { case ((a, b, c), (d, e, f)) =>
(a, b, c, d, e, f)
} // Array[(String, String, String, String, String, String)]
一旦你有了元组数组。。。你仍然不能";只是";扁平化它,因为将数组中的所有元组组合为一个元组的直观、内置、默认方式是什么?你可以这样做,例如使用foldLeft/foldRight/reduce,但你仍然需要告诉如何:
val xs2: Array[(String, String, String, String, String, String)]
xs2.foldLeft(initialValue) { (tuple1, tuple) =>
// your definition how to combine them
}
例如,如果您想在相应的位置上连接值
val xs: Array[((String, String, String),(String, String, String))]
xs.map { case ((a, b, c), (d, e, f)) =>
(a, b, c, d, e, f)
}.foldLeft(("", "", "", "", "", "")) {
case ((a1,b1,c1,d1,e1,f1), (a2,b2,c2,d2,e2,f2)) =>
(a1+a2, b1+b2, c1+c2, d1+d2, e1+e2, f1+f2)
} // (String, String, String, String, String, String)
它也可以在一个步骤中完成:
val xs: Array[((String, String, String),(String, String, String))]
xs.foldLeft(("", "", "", "", "", "")) {
case ((a1,b1,c1,d1,e1,f1), ((a2,b2,c2),(d2,e2,f2))) =>
(a1+a2, b1+b2, c1+c2, d1+d2, e1+e2, f1+f2)
} // (String, String, String, String, String, String)
但具体的实现取决于你对";扁平化";元组的元组数组。
您可以使用productIterator,但由于它返回Any,您需要在您拥有的类型上匹配:
val x=Seq((("A","B","C"),("D","E","F")),(("A1","B1","C1"),("D1","E1","F1")))
x.flatMap(_.productIterator
.flatMap{
case ys:(String, String, String)=>
ys.productIterator.map{
case xs:String => xs
}})
res0: Seq[String] = List(A, B, C, D, E, F, A1, B1, C1, D1, E1, F1)