Scala集合中的函数(扩展)
1.拉链(zip)
将两个集合进行 对偶元组合并,可以使用拉链
1 2 3 4 5 6 7 8 | object Demo _ 031 { def main(args : Array[String]) : Unit = { val list 1 = List( 1 , 2 , 3 ) val list 2 = List( 4 , 5 , 6 ) val list 3 = list 1 .zip(list 2 ) // (1,4),(2,5),(3,6) println( "list3=" + list 3 ) } } |
输出
注意事项
- 拉链的本质就是两个集合的合并操作,合并后每个元素是一个对偶元组。
- 操作的规则下图:
- 如果两个集合个数不对应,会造成数据丢失。
- 集合不限于List, 也可以是其它集合比如 Array
- 如果要取出合并后的各个对偶元组的数据,可以遍历
1 2 3 | for (item<-list 3 ){ print(item. _ 1 + " " + item. _ 2 ) //取出时,按照元组的方式取出即可 } |
2.迭代器(Iterator)
通过iterator方法从集合获得一个迭代器,通过while循环和for表达式对集合进行遍历
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | object Demo _ 032 { def main(args : Array[String]) : Unit = { val iterator = List( 1 , 2 , 3 , 4 , 5 ).iterator // 得到迭代器 println( "--------遍历方式1 -----------------" ) while (iterator.hasNext) { println(iterator.next()) } println( "--------遍历方式2 for -----------------" ) for (enum <- iterator) { println(enum) // } } } |
3.流(stream)
stream是一个集合。这个集合,可以用于存放无穷多个元素,但是这无穷个元素并不会一次性生产出来,而是需要用到多大的区间,就会动态的生产,末尾元素遵循lazy规则(使用时才加载)
使用tail,会动态的向stream集合按规则生成新的元素
1 2 3 4 5 6 7 8 9 10 11 | object Demo _ 033 { def main(args : Array[String]) : Unit = { def numsForm(n : BigInt) : Stream[BigInt] = n #:: numsForm(n + 1 ) val stream 1 = numsForm( 1 ) println(stream 1 ) // //取出第一个元素 println( "head=" + stream 1 .head) // println(stream 1 .tail) //注意不能使用stream.last,否则会陷入无限循环 println(stream 1 ) // } } |
运行结果
实例:使用map映射stream的元素并进行一些计算
1 2 3 4 5 6 7 8 9 | object Demo _ 034 { def main(args : Array[String]) : Unit = { def numsForm(n : BigInt) : Stream[BigInt] = n #:: numsForm(n + 1 ) def multi(x : BigInt) : BigInt = { x * x } println(numsForm( 5 ).map(multi)) //? (25,?) } } |
输出
4.视图(view)
Stream的懒加载特性,也可以对其他集合应用view方法来得到类似的效果,具有如下特点:
- view方法产出一个总是被懒执行的集合。
- view不会缓存数据,每次都要重新计算,比如遍历View时。
实例:请找到1-100 中,数字倒序排列 和它本身相同的所有数。(1 2, 11, 22, 33 ...)
1 2 3 4 5 6 7 8 9 10 11 12 13 | object Demo _ 035 { def main(args : Array[String]) : Unit = { def eq(i : Int) : Boolean = { i.toString.equals(i.toString.reverse) } //说明: 没有使用view val viewSquares 1 = ( 1 to 100 ).filter(eq) println(viewSquares 1 ) //使用view val viewSquares 2 = ( 1 to 100 ).view.filter(eq) println(viewSquares 2 ) } } |
输出结果
5.并行集合
应用案例 parallel
- 打印1~5
1 2 3 4 5 6 7 8 9 10 11 | object Demo _ 036 { def main(args : Array[String]) : Unit = { def method(i : Int) : Unit = { print( "\t" +i) } ( 1 to 5 ).foreach(method) println() ( 1 to 5 ).par.foreach(method) //并行方式输出 } } |
输出
- 查看并行集合中元素访问的线程
1 2 3 4 | val result 1 = ( 0 to 100 ).map{ case _ = > Thread.currentThread.getName} val result 2 = ( 0 to 100 ).par.map{ case _ = > Thread.currentThread.getName} println(result 1 ) println(result 2 ) |
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程