Scala WrappedArray 是什么?怎么创建和使用它?

文章导读
Previous Quiz Next WrappedArray 是 Java 数组与 Scala 集合之间的桥梁。它为 Scala 集合提供了各种功能。你可以使用索引访问其元素。本文将讨论 WrappedArray。
📋 目录
  1. Scala WrappedArray 类
  2. Scala 2.12 示例
  3. Scala 2.13+ 示例
  4. 创建 WrappedArray
  5. 访问和操作元素
  6. 将 WrappedArray 转换为其他集合
  7. Scala 中 Array 和 WrappedArray 的区别
  8. WrappedArray 类方法
A A

Scala - WrappedArray



Previous
Quiz
Next

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

找到最小元素。