Scala List в Seq

У меня есть scala-код, подобный этому

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

Здесь test возвращает tokens.toSeq (Seq (String)), но я ожидаю только List (String). Может быть, это очень просто для опытного человека, но я пробовал весь путь, который я знаю на базовом уровне, но не смотрю. Пожалуйста, помогите мне, если кто-то почувствует, что это очень легко.

scala,scala-collections,

0

Ответов: 3


2 принят

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все равно создадите Listпод капотом:

Vector

Seqинтересно. Если ваши данные будут лучше приспособлены для хранения в a, Listэто превратит его в вектор; в противном случае, он будет превратить его в VectorScala > Вэл тест : Seq [ Строка ] = лексемы тест : Seq [ Струнные ] = List ( с , программы , остановлен ) SCALA > VAL test2 : Seq [ Струнные ] = для ( маркер < - токены ) выход маркера test2 : Seq [ Строка ] = Список ( то , программа , остановились ) Scala > Val test3 = ( маркеры : Seq [ Строка ]) test3 : Seq [ Строка ] = Список ( то , программа , остановлен ) Скала > знач test4 : Seq [ String ] = токены . mkString ( "" ). split ( "" ). toSeq test4 : Seq [ Строка ] = WrappedArray ( то , программа , остановились ) s интересны сами по себе ...) , - как это супертипом как и . Во всяком случае, вы должны по умолчанию использовать другие типы коллекций, если у вас нет конкретного варианта использования, но это ответ на другой вопрос. Seq[String]SeqListVector

Разумеется, другие альтернативы:

List

(Просто шутишь об этом последнем)

Навынос , хотя в том , что вы можете просто указать тип переменной , как Seqи Scala будет рассматривать его как таковой из - за того , как он обрабатывает , , и т.д. под капотом.val test: Seq[String] = tokensval test = (tokens: Seq[String])Vector


1

Listявляется подтипом List. Вам вообще не нужны какие-либо соображения, вам нужно только приписать тип:

Seq

или:

Seq

0

В первую очередь Listпроходит Seqза кулисами, так что вы на самом деле есть Seq. Вы можете понизить уровень определения.

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

Теперь, чтобы ответить на ваш вопрос, в конвертах коллекции Scala часто помогают toXXXметоды.

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

В более продвинутом чтении, посмотрите CanBuildFrom, что является магией за кулисами.

масштаб, масштаб-коллекция,
Похожие вопросы
Яндекс.Метрика