toList
(или toStream
, если вы хотите, чтобы он ленивый) был предпочтительным способом, если вы хотите LinearSeq
, так как вы можете быть уверены, что то, что вы получите, является неизменным (потому что List и Stream есть). Нет способа toVector
, если вы хотите неизменный IndexedSeq
, но кажется, что toIndexedSeq
дает вам Вектор (который является неизменяемым) большинство, если не все время.
Другой способ - использовать breakOut
. Это будет смотреть на тип, к которому вы стремитесь, в вашем типе возврата, и, если возможно, обязывает вас. например,
scala> val ms = collection.mutable.Seq(1,2,3)
ms: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)
scala> val r: List[Int] = ms.map(identity)(collection.breakOut)
r: List[Int] = List(1, 2, 3)
scala> val r: collection.immutable.Seq[Int] = ms.map(identity)(collection.breakOut)
r: scala.collection.immutable.Seq[Int] = Vector(1, 2, 3)
Для получения дополнительной информации о такой черной магии, получите крепкий кофе и посмотрите этот вопрос .