我同意那些询问有关您的用例的更多信息的人的观点。如果不了解更多关于您尝试转换的数据的信息,就很难推荐一个简洁的解决方案来满足您的需求。
请暂时考虑一下我要说的话,因为我对您要做什么还不够了解。
你说你输出的元组可以变化。您是否考虑过将所有内容从 Tuple 转换为 Vector?
所以而不是
res17: Vector[(String, String)] = Vector((u, v),(w, x))
利用
res17: Vector[Vector[String]] = Vector(Vector(u, v),Vector(w, x))
然后,您可以通过调用 flatMap 或 flatten 轻松地将 Vector 的 Vector 转换为单个 Vector,根据您的问题,听起来您已经知道该怎么做。
我从阅读您的问题中得到的另一个印象是,如果您想保留从该参数列表转换为向量的固定长度参数列表,您可能需要查看案例类而不是元组。
因此,不要定义Tuple2
or Tuple3
,而是定义一个允许编译器对您的程序进行类型检查的继承层次结构。
像这样的东西:
trait MyData
case class 2MemberData(data1: String, data2: String) extends MyData
case class 3MemberData(data1: String, data2: String, data3: String) extends MyData
case class 4MemberData(data1: String, data2: String, data3: String, data4: String) extends My Data
这样,您的函数可以输出 Vector[MyData] 类型的值,然后您可以使用模式匹配将其展平。所以像
def processData: Vector[MyData]
def cleanUp(input: Vector[MyData]): Vector[String]
其中 cleanUp 实现如下:
def cleanUp(input: Vector[MyData]): Vector[String] = {
input.flatMap{ d =>
d match {
case 2MemberData(data1, data2) => Vector(data1, data2)
case 3MemberData(data1, data2, data3) => Vector(data1, data2, data3)
case 4MemberData(data1, data2, data3, data4) => Vector(data1, data2, data3, data4)
}
}
}
我只是把想法扔在那里,不知道我所说的是否有帮助。这实际上取决于周围的代码是什么样的。如果您有任何问题随时问。