JSF Learner
JSF Learner

Reputation: 183

Scala List into Seq

I have a scala code like this

val tokens = List("the", "program", "halted")
val test = for (c <- tokens) yield Seq(c) 

Here test is returning List(Seq(String)) but I'm expecting Seq(String) only. Maybe it's very simple for an experienced person but I tried all the way which I know in the basic level but no look. Please help me if anyone feels its very easy.

Upvotes: 1

Views: 11899

Answers (3)

James Whiteley
James Whiteley

Reputation: 3468

tokens.toSeq will do, but if you type this into the command line you will see that Seq will just create a List under the hood anyway:

scala> val tokens = List("the", "program", "halted")
tokens: List[String] = List(the, program, halted)

scala> tokens.toSeq
res0: scala.collection.immutable.Seq[String] = List(the, program, halted)

Seq is interesting. If your data will be better suited to being stored in a List it will turn it into a list; otherwise, it will turn it into a Vector (and Vectors are interesting in their own right...) - as Seq is a supertype of both List and Vector. If anything, you should really default to using Vector over other collection types unless you have a specific use case, but that's an answer to another question.

Other alternatives are of course:

scala> val test: Seq[String] = tokens
test: Seq[String] = List(the, program, halted)

scala> val test2: Seq[String] = for (token <- tokens) yield token
test2: Seq[String] = List(the, program, halted)

scala> val test3 = (tokens: Seq[String])
test3: Seq[String] = List(the, program, halted)

scala> val test4: Seq[String] = tokens.mkString(" ").split(" ").toSeq
test4: Seq[String] = WrappedArray(the, program, halted)

(Just joking about that last one)

The takeaway though is that you can just specify the variable type as Seq[String] and Scala will treat it as such due to how it handles Seq, List, Vector etc under the hood.

Upvotes: 6

flavian
flavian

Reputation: 28511

First of all List extends Seq behind the scenes, so you do actually have a Seq. You can downcast at definition level.

val tokens: Seq[String] = List("the", "program", "halted")

Now to answer your question, in Scala collection conversions are often facilitated by toXXX methods.

val tokens: Seq[String] = List("the", "program", "halted").toSeq

In more advanced reading, look at CanBuildFrom, which is the magic behind the scenes.

Upvotes: 0

Andrey Tyukin
Andrey Tyukin

Reputation: 44908

List is a subtype of Seq. You don't need any for-comprehensions at all, you only have to ascribe the type:

val test: Seq[String] = tokens

or:

val test = (tokens: Seq[String])

Upvotes: 1

Related Questions