将 X 的序列转换为 Y 的序列的最有效方法是什么

What is the most efficient way to transform of seq of X to a seq of Y

我有一个 Seq 个像 Seq(x1, x2, x3, x4) 这样的对象,我想将它转换为 Seq(y1, y2, y3, y4)

最有效的方法是什么

现在的我

val seq1 = Seq(x1, x2, x3......)
var seq2 = Seq[MyType2]()



for (myObj <- seq1) {
    seq2 = seq2 :+ myObj.tranformToType2
}

问题是 scala 文档说

https://www.scala-lang.org/api/2.12.x/scala/collection/Seq.html

a new sequence consisting of all elements of this sequence followed by elem.

所以我想知道将一个对象列表转换为另一个对象列表的最idiomatic/efficient方法是什么

您编写的代码是 Scala 命令式风格,但 Scala 旨在成为一种函数式语言。

功能方法是:

val seq2 = seq1.map(myObj => myObj.tranformToType2)

// Or shorter:
val seq2 = seq1.map(_.tranformToType2)

map 是函数编程中最有用的操作之一。您会发现,当您需要将某些东西转换成其他东西时,您会在任何地方使用它。

根据经验,每当您看到 varfor 循环时,这很臭,您应该问问自己 我如何以功能方式执行此操作?

map 是您要查找的函数。查看 docs 了解详情。

一个简单的例子:

case class MyType1(x: String)
case class MyType2(x: Int)

val ls: Seq[MyType2] = Seq(MyType1("hello"), MyType1("world")).map(mt1 => MyType2(mt1.content.length))