Когда я пытаюсь избежать всех уродливых вещей с подчеркиванием чисел, которые идут с манипуляциями с кортежами, мне нравится использовать регистр символов:
rddData.map { case (a, (b, c)) => (a, b, c) }
Вы также можете дать своим переменным значимые имена, чтобы сделать ваш код самостоятельнодокументирование и использование фигурных скобок означает, что у вас меньше вложенных скобок.
РЕДАКТИРОВАТЬ: шаблон map {case ...} довольно компактен и может использоваться для удивительно глубоких вложенных кортежей, если структура известнаво время компиляции.Если вы абсолютно точно не можете знать структуру кортежа во время компиляции, то вот какой-то хакерский, медленный код, который, вероятно, может сгладить любой произвольно вложенный кортеж ... до тех пор, пока всего не более 23 элементов.Он работает путем рекурсивного преобразования каждого элемента кортежа в список, преобразования его в один список, а затем с помощью страшного отражения конвертирует список обратно в кортеж, как видно здесь .
def flatten(b:Product): List[Any] = {
b.productIterator.toList.flatMap {
case x: Product => flatten(x)
case y: Any => List(y)
}
}
def toTuple[Any](as:List[Any]):Product = {
val tupleClass = Class.forName("scala.Tuple" + as.size)
tupleClass.getConstructors.apply(0).newInstance(as.map(_.asInstanceOf[AnyRef]):_*).asInstanceOf[Product]
}
rddData.map(t => toTuple(flatten(t)))