Scala - WrappedArray
WrappedArray 是 Java 数组与 Scala 集合之间的桥梁。它为 Scala 集合提供了各种功能。你可以使用索引访问其元素。本文将讨论 WrappedArray。
Scala WrappedArray 类
WrappedArray 类包装了一个普通的 Array,并添加了 sequence 方法。它类似于 ArrayOps。但是,sequence 方法返回的不是 Array,而是 WrappedArray 实例。它的行为类似于任何 Seq。Scala 中的 WrappedArray 类表示给定类型的数组。它有多种类型,而 Array 仅扩展到 serializable 和 cloneable。你可以包装一个数组,使其能够在需要泛型集合类型(如 Seq)的地方使用。
从 Scala 2.13 版本开始。你需要使用 ArraySeq 类代替 WrappedArray 类。不过,包含 WrappedArray 的代码仍然有效。请注意,WrappedArray 是可变的,而 ArraySeq 是不可变的。
Scala 2.12 示例
以下是在 Scala 2.12 版本中使用 WrappedArray 类的示例 −
// Scala 2.12
import scala.collection.mutable.WrappedArray
object Demo {
def main(args: Array[String]): Unit = {
val wrappedArray = WrappedArray(10, 20, 30, 40, 50)
println(wrappedArray.mkString(", "))
}
Scala 2.13+ 示例
以下是在 Scala 2.13+ 版本中使用 WrappedArray 类的示例 −
// Scala 2.13+
import scala.collection.immutable.ArraySeq
object Demo {
def main(args: Array[String]): Unit = {
val arraySeq = ArraySeq(10, 20, 30, 40, 50)
println(arraySeq.mkString(", "))
}
}
将上述程序保存为 Demo.scala。以下命令用于编译和执行该程序。
命令
>scalac Demo.scala >scala Demo
输出
10, 20, 30, 40, 50
创建 WrappedArray
你可以使用 wrap 方法包装现有的 Java 数组。我们使用 WrappedArray 的 companion object。
例如,
import scala.collection.mutable.WrappedArray val javaArray = Array(1, 2, 3, 4, 5) val wrappedArray = WrappedArray.make(javaArray)
请注意,你也可以在需要时隐式转换 Java 数组。
val numberList: Array[Int] = Array(6, 7, 8, 9, 10) val convertedArray: WrappedArray[Int] = numberList print(convertedArray.reverse)
输出将为,
10, 9, 8, 7, 6
然而,从 Scala 2.13 版本开始,由于与 ArraySeq 类功能重叠,WrappedArray 类已被弃用。因此,如果使用 Scala 2.13 或更高版本编译代码,将生成警告。
访问和操作元素
WrappedArray 的行为类似于其他 Scala 集合。因此,你可以执行各种操作,如元素访问、修改、遍历等。你可以使用常规的索引语法访问元素。例如,
val firstElement = wrappedArray(0)
由于 WrappedArray 是可变的,因此你也可以直接修改其元素。例如,
wrappedArray(0) = 10
你可以使用 foreach、map、filter 等高阶函数遍历元素。例如,
import scala.collection.mutable.WrappedArray
object Demo {
def main(args: Array[String]): Unit = {
val javaArray = Array(1, 2, 3, 4, 5)
val wrappedArray = WrappedArray.make(javaArray)
wrappedArray.foreach(println)
val doubledArray = wrappedArray.map(_ * 2)
println(doubledArray.mkString(", "))
}
}
将上述程序保存为 Demo.scala。以下命令用于编译和执行该程序。
命令
>scalac Demo.scala >scala Demo
输出
1 2 3 4 5 2, 4, 6, 8, 10
将 WrappedArray 转换为其他集合
您可以使用 toList、toSet 和 toArray 等方法将 WrappedArray 转换为其他集合。例如,
val list = wrappedArray.toList val set = wrappedArray.toSet val newArray = wrappedArray.toArray
Scala 中 Array 和 WrappedArray 的区别
| 方面 | Array | WrappedArray |
|---|---|---|
| 功能 | 镜像 Java array 的结构,没有任何开销。 | 包装 Array 以提供额外功能。 |
| 类型 | 仅扩展 Serializable 和 Cloneable。 | 有多种类型。 |
| 用法 | 在需要 array 且开销最小的地方使用。 | 可在需要泛型集合类型如 Seq 的地方使用。 |
| 主要区别 | Array class 镜像 Java array 的结构,没有任何开销。 | 扩展 Array 并提供 sequence 功能,可像 Seq 一样使用。 |
重要的是,从 Scala 2.13 版本开始,推荐使用 ArraySeq class 而非 WrappedArray。但是,使用 WrappedArray 的代码仍然有效。所有方法现在返回 ArraySeq 而非 WrappedArray。
WrappedArray 类方法
以下是 Scala 中 WrappedArray 提供的重要方法。有关完整方法列表,请参阅 Scala 的官方文档。
| 序号 | 方法及其描述 |
|---|---|
| 1 | def apply(index: Int): A 返回给定索引处的元素。 |
| 2 | def array: Array[A] 返回底层 array。 |
| 3 | def elemTag: ClassTag[A] 返回元素类型的 tag。 |
| 4 | def length: Int 返回 array 的长度。 |
| 5 | def map[B](f: A => B): WrappedArray[B] 对所有元素应用函数并返回新的 WrappedArray。 |
| 6 | def foreach[U](f: A => U): Unit 对所有元素应用函数。 |
| 7 | def filter(p: A => Boolean): WrappedArray[A] 返回包含满足谓词的所有元素的新 WrappedArray。 |
| 8 | def toArray: Array[A] 将 WrappedArray 转换为 Array。 |
| 9 | def toList: List[A] 将 WrappedArray 转换为 List。 |
| 10 | def toSet: Set[A] 将 WrappedArray 转换为 Set。 |
| 11 | def reverse: WrappedArray[A] 返回元素按反向顺序排列的新 WrappedArray。 |
| 12 | def slice(from: Int, until: Int): WrappedArray[A] 返回从索引 from(包含)到 until(不包含)包含元素的新 WrappedArray。 |
| 13 | def take(n: Int): WrappedArray[A] 返回包含前 n 个元素的新 WrappedArray。 |
| 14 | def drop(n: Int): WrappedArray[A] 返回除前 n 个元素外的所有元素的新 WrappedArray。 |
| 15 | def zip[B](that: WrappedArray[B]): WrappedArray[(A, B)] 通过组合对应元素,从此 WrappedArray 和另一个 WrappedArray 形成新的 WrappedArray。 |
| 16 | def mkString(start: String, sep: String, end: String): String 将 WrappedArray 转换为字符串,元素由 sep 分隔,并用 start 和 end 包围。 |
| 17 | def contains(elem: A): Boolean 检查 WrappedArray 是否包含指定元素。 |
| 18 | def distinct: WrappedArray[A] 返回移除重复元素的新 WrappedArray。 |
| 19 | def exists(p: A => Boolean): Boolean 检查是否存在满足谓词的元素。 |
| 20 | def find(p: A => Boolean): Option[A] 找到第一个满足谓词的元素。 |
| 21 | def indexOf(elem: A): Int 找到指定元素第一次出现的位置索引。 |
| 22 | def lastIndexOf(elem: A): Int 找到指定元素最后一次出现的位置索引。 |
| 23 | def max: A 找到最大元素。 |
| 24 | def min: A 找到最小元素。 |