Scala Array操作:从定长数组到ArrayBuffer的完整指南

发布时间:2026/11/2 18:53:59

Scala Array操作:从定长数组到ArrayBuffer的完整指南 Scala的Array就是Java数组的封装但Scala给它装上了集合操作的超能力。索引访问、map/filter、与List互转——让数组处理从Java的for循环中解放出来。如果你从Java转到Scala第一次用数组时可能会有疑问Scala的Array和Java的数组是同一个东西吗为什么可以直接用map和filter第一个问题的答案是是的Scala的Array编译后就是Java的数组int[]、String[]JVM层面完全一样。第二个问题的答案是Scala通过隐式转换把Array当作Seq来操作——你写的是数组用的却是集合的API。在大数据开发中数组无处不在Spark RDD的分区数据是数组、Flink的窗口缓冲区是数组、NumPy风格的数值计算依赖数组。理解Scala的Array就是理解大数据内存计算的底层数据结构。这篇文章从七个层面拆解Scala的Array操作帮你从Java的数组处理中平滑迁移。01 Array基础定长、可变、与Java互操作Array就是Java数组// Scala的Array编译后就是Java数组valarrArray(1,2,3,4,5)// 编译后等价于Java的 int[] arr {1,2,3,4,5};// 可以直接索引访问arr(0)// 1arr(4)// 5// 可以修改元素数组是可变的arr(0)10// arr: Array(10, 2, 3, 4, 5)Array是定长的valarrnewArray[Int](5)// 长度固定为5不能动态扩展arr(0)1arr(1)2// arr: Array(1, 2, 0, 0, 0)// arr 6 // 编译错误Array长度固定Array与Java数组互操作// Scala Array就是Java数组可以直接传给Java方法defprocessJavaArray(arr:Array[Int]):Unit{// 这个arr在JVM层面就是int[]arr.foreach(println)}// 也可以从Java数组创建Scala ArrayvaljavaArr:Array[Int]Array(1,2,3)// 完全等价对Java开发者的启示Java数组和Scala数组在JVM层面是同一个东西互操作零成本。这意味着你可以在Scala代码中直接调用Java库传入数组参数不需要任何转换。02 Array创建与初始化用apply方法创建// 最常用Array.applyvalarr1Array(1,2,3,4,5)// Array[Int] Array(1, 2, 3, 4, 5)// 混合类型会自动推断公共父类型valarr2Array(1,two,3.0)// Array[Any] Array(1, two, 3.0)// 空数组valemptyArray.empty[String]// Array[String] Array()用new创建指定长度// 创建指定长度的数组元素为默认值valarr1newArray[Int](5)// Array(0, 0, 0, 0, 0)valarr2newArray[String](3)// Array(null, null, null)valarr3newArray[Boolean](2)// Array(false, false)常用初始化方法// range生成范围数组Array.range(1,10)// Array(1,2,3,4,5,6,7,8,9)Array.range(1,10,2)// Array(1,3,5,7,9)步长2// fill填充相同值Array.fill(5)(hello)// Array(hello, hello, hello, hello, hello)Array.fill(3,2)(0)// 二维数组 Array(Array(0,0), Array(0,0), Array(0,0))// tabulate按函数生成Array.tabulate(5)(nn*n)// Array(0, 1, 4, 9, 16)// concatenate合并数组Array.concat(Array(1,2),Array(3,4))// Array(1, 2, 3, 4)03 Array常用操作索引访问与修改valarrArray(10,20,30,40,50)// 读取arr(0)// 10arr.last// 50arr.head// 10arr.apply(2)// 30等价于arr(2)// 修改arr(0)100// arr: Array(100, 20, 30, 40, 50)// 长度arr.length// 5arr.size// 5等价于length遍历valarrArray(a,b,c)// 最简单foreacharr.foreach(println)// 带索引for((elem,i)-arr.zipWithIndex){println(s$i:$elem)}// 传统for循环for(i-0until arr.length){println(arr(i))}转换与映射valarrArray(1,2,3,4,5)// map每个元素转换arr.map(_*2)// Array(2, 4, 6, 8, 10)// filter过滤元素arr.filter(_%20)// Array(2, 4)// reduce聚合arr.reduce(__)// 15// fold带初始值的聚合arr.fold(0)(__)// 15排序valarrArray(3,1,4,1,5,9,2,6)// 升序排序返回新数组arr.sorted// Array(1, 1, 2, 3, 4, 5, 6, 9)// 降序arr.sortWith(__)// Array(9, 6, 5, 4, 3, 2, 1, 1)// 按指定字段排序caseclassPerson(name:String,age:Int)valpeopleArray(Person(Alice,25),Person(Bob,20),Person(Charlie,30))people.sortBy(_.age)// 按年龄升序04 ArrayBuffer可变数组Array是定长的需要动态扩展时用ArrayBuffer。创建与操作importscala.collection.mutable.ArrayBuffer// 创建ArrayBuffervalbufArrayBuffer[Int]()// ArrayBuffer()// 添加元素buf1buf2buf3// ArrayBuffer(1, 2, 3)// 添加多个元素buf(4,5,6)// ArrayBuffer(1, 2, 3, 4, 5, 6)// 追加另一个集合bufArray(7,8)// ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)删除与修改valbufArrayBuffer(1,2,3,4,5)// 删除最后一个元素buf.remove(buf.length-1)// ArrayBuffer(1, 2, 3, 4)// 删除指定位置buf.remove(0)// ArrayBuffer(2, 3, 4)// 修改buf(0)100// ArrayBuffer(100, 3, 4)转换为ArrayvalbufArrayBuffer(1,2,3,4,5)// 转换为定长Arrayvalarrbuf.toArray// Array(1, 2, 3, 4, 5)// 转换为Listvallistbuf.toList// List(1, 2, 3, 4, 5)05 Array与集合互转Array ↔ ListvalarrArray(1,2,3,4,5)// Array转Listvallistarr.toList// List(1, 2, 3, 4, 5)// List转Arrayvalarr2list.toArray// Array(1, 2, 3, 4, 5)// Array转Seqvalseqarr.toSeq// WrappedArray(1, 2, 3, 4, 5)Array与集合操作的关系valarrArray(1,2,3,4,5)// Array本身不是Seq但可以通过隐式转换使用Seq的方法arr.map(_*2)// 返回Arrayarr.filter(_2)// 返回Arrayarr.reduce(__)// 返回Intarr.mkString(, )// 1, 2, 3, 4, 5// 注意map/filter返回的还是Arrayarr.map(_*2).getClass.getSimpleName// int[]基本类型数组或 Object[]WrappedArrayArray的Seq视图valarrArray(1,2,3)// 当你需要Seq类型时Array会自动转换为WrappedArrayvalseq:Seq[Int]arr// WrappedArray(1, 2, 3)// WrappedArray是Array的Seq视图不复制数据// 修改原数组视图也会变arr(0)100println(seq)// WrappedArray(100, 2, 3)大数据场景提示Spark的RDD.collect()返回的就是Array而RDD的map/filter返回的是RDD。理解Array和集合操作的关系有助于理解Spark转换操作的底层实现。06 多维数组创建多维数组// 二维数组3行4列valmatrixArray.ofDim[Int](3,4)// Array(Array(0,0,0,0), Array(0,0,0,0), Array(0,0,0,0))// 赋值matrix(0)(0)1matrix(1)(1)2// Array(Array(1,0,0,0), Array(0,2,0,0), Array(0,0,0,0))// 创建并初始化valgridArray(Array(1,2,3),Array(4,5,6),Array(7,8,9))// 3x3矩阵多维数组操作valmatrixArray(Array(1,2,3),Array(4,5,6),Array(7,8,9))// 访问matrix(0)(0)// 1matrix(1)(2)// 6// 遍历所有元素for{row-matrix elem-row}print(elem )// 1 2 3 4 5 6 7 8 9// 扁平化二维数组转一维matrix.flatten// Array(1, 2, 3, 4, 5, 6, 7, 8, 9)07 与Java数组的对比理解Scala和Java数组操作的差异能帮助你避免常见的迁移陷阱。核心差异对比维度JavaScala数组创建int[] arr new int[5]Array(1,2,3) 或 new ArrayInt索引访问arr[0]arr(0)长度arr.lengtharr.length 或 arr.size遍历for(int i0;…)arr.foreach 或 for推导式转换Arrays.stream(arr)arr.map/filter/reduce排序Arrays.sort(arr)arr.sorted 或 arr.sortBy拼接Arrays.toString(arr)arr.mkString(, )可变数组ArrayListArrayBuffer互操作本身就是数组编译后就是Java数组Java数组操作 vs Scala数组操作// Java: 数组创建int[]arrnewint[5];arr[0]1;arr[1]2;// Java: 数组遍历for(inti0;iarr.length;i){System.out.println(arr[i]);}// Java: 数组排序Arrays.sort(arr);// Java: 数组转字符串System.out.println(Arrays.toString(arr));// Scala: 数组创建valarrArray(1,2,3,4,5)// Scala: 数组遍历arr.foreach(println)// Scala: 数组排序arr.sorted// Scala: 数组转字符串arr.mkString(, )Scala数组工具方法// 常用工具方法importscala.util.Sorting.quickSortvalarrArray(3,1,4,1,5,9,2,6)// 快速排序原地修改quickSort(arr)// arr: Array(1, 1, 2, 3, 4, 5, 6, 9)// 数组合并Array.concat(Array(1,2),Array(3,4))// 数组填充Array.fill(5)(0)写在最后数组是数据工程的底层数据结构Scala的Array表面上是Java数组的语法糖封装本质上是把数组从一个固定大小的内存块提升为一个可以函数式操作的集合。这种提升带来三个好处更简洁的操作map/filter/reduce替代了Java的for循环和Stream代码更易读更强的互操作性Scala Array编译后就是Java数组与Java库零成本互操作更灵活的扩展ArrayBuffer提供了动态扩展能力不需要手动管理数组大小这些特性不是孤立的它们共同支撑了Scala的数据处理范式。Spark的RDD分区数据是数组、Flink的窗口缓冲区是数组、NumPy风格的数值计算依赖数组——这些框架的底层都是Scala数组操作的分布式版本。学习建议不要试图一次记住所有方法。先从数组创建和索引访问开始写一些小练习。当你习惯了用map/filter处理数组后再学习ArrayBuffer和多维数组。数组是编程的基本功但在Scala里它不仅是基本功——它是函数式数据处理的入口。从Java的数组遍历和操作到Scala的map/filter/reduce不是学习另一种数组API而是学习一种更函数式、更声明式、更组合的数据处理方式。当你习惯了用Array.apply创建、用foreach遍历、用map转换、用reduce聚合你会发现原来数组处理可以这么优雅。
延伸阅读

更多相关文章

2026/11/2 18:53:59

MonoGame 跨平台游戏开发:30 分钟写出一个能动的方块

MonoGame 跨平台游戏开发:30 分钟写出一个能动的方块 【免费下载链接】MonoGame One framework for creating powerful cross-platform games. 项目地址: https://gitcode.com/gh_mirrors/mo/MonoGame 你手上有一个很小的创意:一个方块在窗口里移…

2026/11/2 18:53:59

低压电工作业实操考试题库-2026 年版-低压电工实操考试

概要本文档主要说明低压电工实操考试内容和要求,涵盖考试科目构成、考试规则与评分标准,帮助考生系统了解考试全貌并做好备考准备。详细说明文件,请查看顶部附件。科目说明实操考试包括4个科目,分别为:科目一 安全用具使用(包含4道试题);科目二 作业现场安全隐患排除(…

2026/11/2 19:59:17

Generative UI 工程化实践:JSON 驱动的声明式 UI 协议

1. 项目概述:这不是一个“渲染库”,而是一套 Generative UI 的工程化契约你点开 Vercel Labs 的json-render仓库,第一眼看到的可能是个轻量级 JSON 渲染器——输入一段结构化 JSON,输出对应的 React 组件树。但如果你真这么理解&a…

2026/11/2 19:59:17

Maven私有仓库依赖解析失败排查指南

1. 私有仓库依赖解析失败现象分析 当Maven构建过程中出现 [ERROR] Failed to execute goal on project example-thirdparty-app: 错误时,90%的情况都与依赖解析机制相关。典型报错会伴随以下关键信息: [ERROR] Failed to execute goal on project ex…

2026/11/2 19:59:17

C-NCAP 2024版规则拆解:碰撞速度、SC-MDB与星级得分变化

简介:《C-NCAP管理规则(2024年版)》面向汽车安全研发、测试认证、法规研究及购车参考人群,系统梳理中国新车评价规程的管理框架与评价办法,适合汽车工程、检测认证、法规合规与购车决策等场景查阅。压缩包内为1个PDF文…

2026/11/2 19:59:17

AI因子造假识别与过拟合排查:量化策略验证全流程

最近社群里的画风变得很快。以前大家问的是“这个策略回测怎么样”,现在直接变成“我用AI批量生成了几十个因子,回测年化百分之两三百,能不能直接用”。老实说,看到这类问题我第一反应不是兴奋,而是先把放大镜找出来。…

2026/11/2 19:54:16

具身智能世界模型:技术原理与应用实践

1. 具身智能世界模型的概念解析 具身智能世界模型(Embodied AI World Model)是当前人工智能领域最具突破性的研究方向之一。简单来说,它是指让AI系统通过物理或虚拟的"身体"与环境互动,从而构建对世界的理解和预测能力。…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑