Echo
Echo

Reputation: 3029

Iterate Over a tuple

I need to implement a generic method that takes a tuple and returns a Map Example :

val tuple=((1,2),(("A","B"),("C",3)),4)

I have been trying to break this tuple into a list :

val list=tuple.productIterator.toList
Scala>list: List[Any] = List((1,2), ((A,B),(C,3)), 4)

But this way returns List[Any] .

I am trying now to find out how to iterate over the following tuple ,for example :

((1,2),(("A","B"),("C",3)),4)

in order to loop over each element 1,2,"A",B",...etc. How could I do this kind of iteration over the tuple

Upvotes: 8

Views: 10964

Answers (4)

Aravind Krishnakumar
Aravind Krishnakumar

Reputation: 2777

This works for me. tranform is a tuple consists of dataframes

def apply_function(a: DataFrame) = a.write.format("parquet").save("..." + a + ".parquet")
transform.productIterator.map(_.asInstanceOf[DataFrame]).foreach(a => apply_function(a))

Upvotes: 0

david.perez
david.perez

Reputation: 7022

Instead of tuples, use Shapeless data structures like HList. You can have generic processing, and also don't lose type information.

The only problem is that documentation isn't very comprehensive.

Upvotes: 3

Peter Schmitz
Peter Schmitz

Reputation: 5844

What about? :

def flatProduct(t: Product): Iterator[Any] = t.productIterator.flatMap {
  case p: Product => flatProduct(p)
  case x => Iterator(x)
}
val tuple = ((1,2),(("A","B"),("C",3)),4)
flatProduct(tuple).mkString(",") // 1,2,A,B,C,3,4

Ok, the Any-problem remains. At least that´s due to the return type of productIterator.

Upvotes: 15

Rustem Suniev
Rustem Suniev

Reputation: 1149

tuple.productIterator map { 
   case (a,b) => println(a,b) 
   case (a) => println(a)
}

Upvotes: 2

Related Questions