Scala集合操作
1 集合简介
Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类:
可变集合: 可以被修改。即可以更改,添加,删除集合中的元素;
不可变集合类:不能被修改。对集合执行更改,添加或删除操作都会返回一个新的集合,而不是修改原来的集合。
2 集合结构
Scala 中的大部分集合类都存在三类变体,分别位于 scala.collection, scala.collection.immutable, scala.collection.mutable 包中。还有部分集合类位于 scala.collection.generic 包下。
scala.collection.immutable:包是中的集合是不可变的;
scala.collection.mutable:包中的集合是可变的;
scala.collection:包中的集合,既可以是可变的,也可以是不可变的。
val sortSet = scala.collection.SortedSet(1, 2, 3, 4, 5)
val mutableSet = collection.mutable.SortedSet(1, 2, 3, 4, 5)
val immutableSet = collection.immutable.SortedSet(1, 2, 3, 4, 5)
如果你仅写了 Set 而没有加任何前缀也没有进行任何 import,则 Scala 默认采用不可变集合类。
scala> Set(1,2,3,4,5)
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
2.1 scala.collection
scala.collection 包中所有集合如下图:
2.2 scala.collection.mutable
scala.collection.mutable 包中所有集合如下图:
2.3 scala.collection.immutable
scala.collection.immutable 包中所有集合如下图:
3 Trait Traversable
Scala 中所有集合的顶层实现是 Traversable 。它唯一的抽象方法是 foreach:
def foreach[U](f: Elem => U)
实现 Traversable 的集合类只需要实现这个抽象方法,其他方法可以从 Traversable 继承。Traversable 中的所有可用方法如下
方法 | 作用 |
Abstract Method: | |
xs foreach f | 为 xs 的每个元素执行函数 f |
Addition: | |
xs ++ ys | 一个包含 xs 和 ys 中所有元素的新的集合。 ys 是一个 Traversable 或 Iterator。 |
Maps: | |
xs map f | 对 xs 中每一个元素应用函数 f,并返回一个新的集合 |
xs flatMap f | 对 xs 中每一个元素应用函数 f,最后将结果合并成一个新的集合 |
xs collect f | 对 xs 中每一个元素调用偏函数 f,并返回一个新的集合 |
Conversions: | |
xs.toArray | 将集合转化为一个 Array |
xs.toList | 将集合转化为一个 List |
xs.toIterable | 将集合转化为一个 Iterable |
xs.toSeq | 将集合转化为一个 Seq |
xs.toIndexedSeq | 将集合转化为一个 IndexedSeq |
xs.toStream | 将集合转化为一个延迟计算的流 |
xs.toSet | 将集合转化为一个 Set |
xs.toMap | 将一个(key, value)对的集合转化为一个 Map。 如果当前集合的元素类型不是(key, value)对形式, 则报静态类型错误。 |
Copying: | |
xs copyToBuffer buf | 拷贝集合中所有元素到缓存 buf |
xs copyToArray(arr,s,n) | 从索引 s 开始,将集合中最多 n 个元素复制到数组 arr。 最后两个参数是可选的。 |
Size info: | |
xs.isEmpty | 判断集合是否为空 |
xs.nonEmpty | 判断集合是否包含元素 |
xs.size | 返回集合中元素的个数 |
xs.hasDefiniteSize | 如果 xs 具有有限大小,则为真。 |
Element Retrieval: | |
xs.head | 返回集合中的第一个元素(如果无序,则随机返回) |
xs.headOption | 以 Option 的方式返回集合中的第一个元素, 如果集合为空则返回 None |
xs.last | 返回集合中的最后一个元素(如果无序,则随机返回) |
xs.lastOption | 以 Option 的方式返回集合中的最后一个元素, 如果集合为空则返回 None |
xs find p | 以 Option 的方式返回满足条件 p 的第一个元素, 如果都不满足则返回 None |
Subcollection: | |
xs.tail | 除了第一个元素之外的其他元素组成的集合 |
xs.init | 除了最后一个元素之外的其他元素组成的集合 |
xs slice (from, to) | 返回给定索引范围之内的元素组成的集合 (包含 from 位置的元素但不包含 to 位置的元素) |
xs take n | 返回 xs 的前 n 个元素组成的集合(如果无序,则返回任意 n 个元素) |
xs drop n | 返回 xs 的后 n 个元素组成的集合(如果无序,则返回任意 n 个元素) |
xs takeWhile p | 从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有遍历到的值。 |
xs dropWhile p | 从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有未遍历到的值。 |
xs filter p | 返回满足条件 p 的所有元素的集合 |
xs withFilter p | 集合的非严格的过滤器。后续对 xs 调用方法 map、flatMap 以及 withFilter 都只用作于满足条件 p 的元素,而忽略其他元素 |
xs filterNot p | 返回不满足条件 p 的所有元素组成的集合 |
Subdivisions: | |
xs splitAt n | 在给定位置拆分集合,返回一个集合对 (xs take n, xs drop n) |
xs span p | 根据给定条件拆分集合,返回一个集合对 (xs takeWhile p, xs dropWhile p)。即遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个集合返回。 |
xs partition p | 按照筛选条件对元素进行分组 |
xs groupBy f | 根据鉴别器函数 f 将 xs 划分为集合映射 |
Element Conditions: | |
xs forall p | 判断集合中所有的元素是否都满足条件 p |
xs exists p | 判断集合中是否存在一个元素满足条件 p |
xs count p | xs 中满足条件 p 的元素的个数 |
Folds: | |
(z /: xs) (op) | 以 z 为初始值,从左到右对 xs 中的元素执行操作为 op 的归约操作 |
(xs :\ z) (op) | 以 z 为初始值,从右到左对 xs 中的元素执行操作为 op 的归约操作 |
xs.foldLeft(z) (op) | 同 (z /: xs) (op) |
xs.foldRight(z) (op) | 同 (xs :\ z) (op) |
xs reduceLeft op | 从左到右对 xs 中的元素执行操作为 op 的归约操作 |
xs reduceRight op | 从右到左对 xs 中的元素执行操作为 op 的归约操作 |
Specific Folds: | |
xs.sum | 累计求和 |
xs.product | 累计求积 |
xs.min | xs 中的最小值 |
xs.max | xs 中的最大值 |
String: | |
xs addString (b, start, sep, end) | 向 StringBuilder b 中添加一个字符串, 该字符串包含 xs 的所有元素。start、seq 和 end 都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。 |
xs mkString (start, seq, end) | 将集合转化为一个字符串。start、seq 和 end 都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。 |
xs.stringPrefix | 返回 xs.toString 字符串开头的集合名称 |
Views: | |
xs.view | 生成 xs 的视图 |
xs view (from, to) | 生成 xs 上指定索引范围内元素的视图 |
下面为部分方法的使用示例:
scala> List(1, 2, 3, 4, 5, 6).collect { case i if i % 2 == 0 => i * 10 }
res0: List[Int] = List(20, 40, 60)scala> List(1, 2, 3, 4, 5, 6).withFilter(_ % 2 == 0).map(_ * 10)
res1: List[Int] = List(20, 40, 60)scala> (10 /: List(1, 2, 3)) (_ + _)
res2: Int = 16scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0)
res3: List[Int] = List(1, 2, 3)scala> List(1, 2, 3, -4, 5) span (_ > 0)
res4: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))scala> List(1, 2, 3).mkString("[","-","]")
res5: String = [1-2-3]
4 Trait Iterable
Scala 中所有的集合都直接或者间接实现了 Iterable 特质,Iterable 拓展自 Traversable,并额外定义了部分方法:
方法 | 作用 |
Abstract Method: | |
xs.iterator | 返回一个迭代器,用于遍历 xs 中的元素, 与 foreach 遍历元素的顺序相同。 |
Other Iterators: | |
xs grouped size | 返回一个固定大小的迭代器 |
xs sliding size | 返回一个固定大小的滑动窗口的迭代器 |
Subcollections: | |
xs takeRigtht n | 返回 xs 中最后 n 个元素组成的集合(如果无序,则返回任意 n 个元素组成的集合) |
xs dropRight n | 返回 xs 中除了最后 n 个元素外的部分 |
Zippers: | |
xs zip ys | 返回 xs 和 ys 的对应位置上的元素对组成的集合 |
xs zipAll (ys, x, y) | 返回 xs 和 ys 的对应位置上的元素对组成的集合。其中较短的序列通过附加元素 x 或 y 来扩展以匹配较长的序列。 |
xs.zipWithIndex | 返回一个由 xs 中元素及其索引所组成的元素对的集合 |
Comparison: | |
xs sameElements ys | 测试 xs 和 ys 是否包含相同顺序的相同元素 |
所有方法示例如下:
scala> List(1, 2, 3).iterator.reduce(_ * _ * 10)
res0: Int = 600scala> List("a","b","c","d","e") grouped 2 foreach println
List(a, b)
List(c, d)
List(e)scala> List("a","b","c","d","e") sliding 2 foreach println
List(a, b)
List(b, c)
List(c, d)
List(d, e)scala> List("a","b","c","d","e").takeRight(3)
res1: List[String] = List(c, d, e)scala> List("a","b","c","d","e").dropRight(3)
res2: List[String] = List(a, b)scala> List("a","b","c").zip(List(1,2,3))
res3: List[(String, Int)] = List((a,1), (b,2), (c,3))scala> List("a","b","c","d").zipAll(List(1,2,3),"",4)
res4: List[(String, Int)] = List((a,1), (b,2), (c,3), (d,4))scala> List("a","b","c").zipAll(List(1,2,3,4),"d","")
res5: List[(String, Any)] = List((a,1), (b,2), (c,3), (d,4))scala> List("a", "b", "c").zipWithIndex
res6: List[(String, Int)] = List((a,0), (b,1), (c,2))scala> List("a", "b") sameElements List("a", "b")
res7: Boolean = truescala> List("a", "b") sameElements List("b", "a")
res8: Boolean = false
5 修改集合
当你想对集合添加或者删除元素,需要根据不同的集合类型选择不同的操作符号:
操作符 | 描述 | 集合类型 |
coll(k) 即 coll.apply(k) | 获取指定位置的元素 | Seq, Map |
coll :+ elem elem +: coll | 向集合末尾或者集合头增加元素 | Seq |
coll + elem coll + (e1, e2, ...) | 追加元素 | Seq, Map |
coll - elem coll - (e1, e2, ...) | 删除元素 | Set, Map, ArrayBuffer |
coll ++ coll2 coll2 ++: coll | 合并集合 | Iterable |
coll -- coll2 | 移除 coll 中包含的 coll2 中的元素 | Set, Map, ArrayBuffer |
elem :: lst lst2 :: lst | 把指定列表 (lst2) 或者元素 (elem) 添加到列表 (lst) 头部 | List |
list ::: list2 | 合并 List | List |
set | set2 set & set2 set &~ set2 | 并集、交集、差集 | Set |
coll += elem coll += (e1, e2, ...) coll ++= coll2 coll -= elem coll -= (e1, e2, ...) coll --= coll2 | 添加或者删除元素,并将修改后的结果赋值给集合本身 | 可变集合 |
elem +=: coll coll2 ++=: coll | 在集合头部追加元素或集合 | ArrayBuffer |
相关文章:

Scala集合操作
1 集合简介 Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素; 不可变集合类:不能被修改。对集合执行更改,…...

SQL备忘--特殊状态“未知“以及“空值NULL“的判断
一、新逻辑状态:未知 对于大多数其他语言的逻辑判断,一般只有两种结果:真(TURE)或假(FALSE)但在SQL中,还会有第三种判断结果:未知(UNKNOWN),表示无法判断出真或者假。 未知状态会影响传统逻辑运算&#x…...

《Pytorch新手入门》第一节-认识Tensor
《Pytorch新手入门》第一节-认识Tensor 一、认识Tensor1.1 Tensor定义1.2 Tensor运算操作1.3 Tensor与numpy转换 参考《深度学习框架PyTorch:入门与实践_陈云(著)》 一、认识Tensor 1.1 Tensor定义 Tensor 是 PyTorch 中重要的数据结构,可认为是一个高…...

【JAVA学习笔记】55 - 集合-Map接口、HashMap类、HashTable类、Properties类、TreeMap类(难点)
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/map_ Map接口 一、Map接口的特点(难点) 难点在于对Node和Entry和EntrySet的关系 注意:这里讲的是JDK8的Map接口特点 Map java 1) Map与Collect…...

Pytorch图像模型转ONNX后出现色偏问题
本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后,在推理过程中出现了明显色偏问题的解决过程。 问题描述:原始pytorch模型推理正常,通过torch.onnx.export()函数转换成onnx之后,推理时出现了比较明显的颜色偏差。 原始模型…...

插值表达式 {{}}
前言 持续学习总结输出中,今天分享的是插值表达式 {{}} Vue插值表达式是一种Vue的模板语法,我们可以在模板中动态地用插值表达式渲染出Vue提供的数据绑定到视图中。插值表达式使用双大括号{{ }}将表达式包裹起来。 1.作用: 利用表达式进行…...

白雪公主
前言 #define 皇后 王后 在很久很久以前,有一个国王,由于王后难产致死,导致生下的孩子没母,由于缺爱,变的非常的刻薄 由于公主过于刻薄,以至于见到她的人都面色煞白感到空中飘雪 37C 的嘴怎能说出如此刻薄的话语。为了…...

宏观角度认识递归之合并两个有序链表
21. 合并两个有序链表 - 力扣(LeetCode) 依旧是利用宏观角度来看待问题,其中最主要的就是要找到重复的子问题; 题目中要求把两个有序链表进行合并,同时不能够创建新的节点,并返回链表的起始点:因…...

Leetcode-509 斐波那契数列
使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…...

解密 docker 容器内 DNS 解析原理
背景 这几天在使用 docker 中,碰到了在容器中 DNS 解析的一些问题。故花些时间弄清了原理,写此文章分享。 1. docker run 命令启动的容器 以启动一个 busybox 容器为例: rootubuntu20:~# docker run -itd --name u1 busybox 63b59ca8aeac…...

故障诊断模型 | Maltab实现SVM支持向量机的故障诊断
效果一览 文章概述 故障诊断模型 | Maltab实现SVM支持向量机的故障诊断 模型描述 Chinese: Options:可用的选项即表示的涵义如下 -s svm类型:SVM设置类型(默认0) 0 – C-SVC 1 --v-SVC 2 – 一类SVM 3 – e -SVR 4 – v-SVR -t 核函数类型:核函…...

开源的网站数据分析统计平台——Matomo
Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面,就可以看到登陆…...

linux入门到地狱
linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退,僵停(vs2019卡掉线),重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…...

架构”4+1“视图
1995年Kruchten提出了著名的“41”视图,用来描述软件系统的架构。在“41”视图中,(物理视图 )用来描述系统软硬件之间的映射关系,这个视图往往(系统工程人员)最为关注;(逻…...

『精』Vue 组件如何模块化抽离Props
『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料💘推荐博文🍗 一、为什么要抽…...

JavaScript字符串字面量详细解析与代码实例
JavaScript字符串字面量是一种表示字符串值的语法结构,通常用双引号或单引号括起来。 var str1 "Hello World!"; var str2 Hello World!;另外,如果需要在字符串中包含双引号或单引号,可以使用转义字符\来实现。 var str3 &quo…...

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据
一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据,实际使用可以成功传统图像数据。 发送:Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…...

CTF工具PDF隐写神器wbStego4open安装和详细使用方法
wbStego4open安装和详细使用方法 1.wbStego4open介绍:2.wbStego4open下载:3.wbStego4open原理图:4.wbStego4open使用教程:第一步:第二步:第三步:第四步:第五步: 5.wbSteg…...

docker镜像使用
一、查看docker版本 docker version docker默认安装目录 /var/lib/docker 目录文件如下: 二、查看下载的镜像 docker images 三、下载镜像 docker pull [OPTIONS] NAME[:TAG|DIGEST] option作用-a, --all-tags拉取所有 tagged 镜像–disable-content-trust…...

【Git】git的下载安装与使用
目录 目录 一.下载安装 官方下载 淘宝镜像下载 安装 二.创建本地仓库 三.git的基本操作命令 git status git add . git commit -m " " 四.gitee(码云)的使用 配置ssh公钥 编辑 查看公钥 gitee创建仓库 将本地仓库的文件上传到远程仓库…...

R语言中的函数27:polynom::polynomial(), deriv(),integral(),solve()多式处理函数
文章目录 介绍polynomial()用法参数实例多项式的加减乘除等运算实例 deriv()和integral()用法参数实例solve()参数实例 介绍 R语言中的polynom包可以实现对多项式的操作,例如:加、减、乘、除、微分、积分。使用的时候先用polynomial()函数定义一个多项式…...

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM
文章目录 前言1. 接口概述1.1 USART/UART接口1.2 串口通信参数1.3 波特率计算 2. 传输函数3. 回环测试3.1 上位机环境配置3.2 阻塞模式3.3 中断模式 4. STM32CubeMX配置4.1 时钟配置4.2 调试配置4.3 串口引脚配置4.4 工程配置 5. 测试效果6. 不借助上位机回环测试总结 前言 这…...

Spring cloud负载均衡 @LoadBalanced注解原理
接上一篇文章,案例代码也在上一篇文章的基础上。 在上一篇文章的案例中,我们创建了作为Eureka server的Eureka注册中心服务、作为Eureka client的userservice、orderservice。 orderservice引入RestTemplate,加入了LoadBalanced注解&#x…...

C#when关键字
在C#中,when关键字用于在模式匹配表达式中添加条件。它允许您在模式匹配的过程中指定额外的条件,以进一步过滤匹配的模式。当模式匹配和附加条件都为真时,相关的代码块将被执行。 以下是when关键字的详细解释以及示例说明: 语法…...

华为政企无线局域网产品集
产品类型产品型号产品说明 室内接入点AirEngine 5760-51AirEngine 5760-51是华为发布的支持Wi-Fi 6(802.11ax)标准的新一代室内AP,适合部署在企业办公、零售、制造等场景。 通过软件定义射频,能够在双频、三频模式灵活切换&a…...

解释 RESTful API
RESTful API是一种基于HTTP协议的API设计风格,它的核心思想是将每个资源(如用户、订单等)抽象成一个URI(统一资源标识符),通过HTTP协议定义的方法(如GET、POST、PUT、DELETE等)对资源…...

青翼科技-国产化ARM系列TES720D-KIT
板卡概述 TES720D-KIT是专门针对我司TES720D(基于复旦微FMQL20S400的全国产化ARM核心板)的一套开发套件,它包含1个TES720D核心板,加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片,在单…...

Tomcat为什么支持线程池?
Tomcat作为一个Java Servlet容器,支持线程池是因为它能够处理多个并发请求。这些请求可以是对Web应用程序的HTTP请求、Servlet的请求,或其他支持的协议。 支持线程池的主要原因包括: 并发处理能力: 提高性能: 使用线程…...

Mac安装VMware
去官网下载一下VMware Download VMware Fusion | VMware | SG 下载完成之后,打开直接闪退,参考这篇文章解决 解决macOS13安装Fusion13闪退的问题-CSDN博客 然后即可成功顺行...

项目部署文档
申请SSL证书 先申请,用免费的 下载证书 先将下载下来的保存起来 服务器安装JDK: 创建develop目录 mkdir /usr/local/develop/ 把JDK压缩包上传到/usr/local/develop/目录 解压安装包 并且将安装到指定目录 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /us…...