Spark-Scala语言实战(4)
在之前的文章中,我们学习了如何在scala中定义无参,带参以及匿名函数。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。
Spark-Scala语言实战(3)-CSDN博客文章浏览阅读654次,点赞19次,收藏14次。今天我会给大家带来如何在Scala中使用函数,了解函数。望在本篇文章中,大家有所收获。也欢迎朋友们到评论区下一起交流学习,共同进步。https://blog.csdn.net/qq_49513817/article/details/136839079?spm=1001.2014.3001.5501
目录
一、知识回顾
二、集合
1.List
a.字符串列表
b.整形
c.::Nil
2.set
a.set创建
b.set操作
c.遍历set
3.map
三、元组
拓展-集合方法
1.List集合方法
2.set集合方法
3.map集合方法
一、知识回顾
在上一篇文章中,我们讲了如和创建一个无参,带参以及匿名函数。

无参并不难理解,直接定义直接输出。

带参函数多注重调用方法

匿名函数就要花心思去理解了,但多实操,也肯定能搞懂。
那么,开启今天的学习吧。
二、集合
scala中,集合分为三大类: List、set以及Map
现在,我们逐个讲解。
1.List
在Scala中,List是一种常用的不可变集合。它代表了一个有序的元素集合,你可以通过索引访问其元素,并且其大小是固定的。由于它是不可变的,所以一旦创建,就不能改变其内容(如添加或删除元素)。
如果要定义可变列表,需要导入 import scala.collection.mutable.ListBuffer 包
a.字符串列表

可以看到,我定义了一个类型为List的字符串集合,并赋给了他"apples", "oranges", "pears"三个字符串,现在我们来运行以下我们的代码看看效果。

运行成功,输出了我们赋予的东西。
package com.tipdm.scalaDemoobject p3 {def main(args: Array[String]): Unit = {val p1: List[String]= List("apples", "oranges", "pears")println(p1)}}
b.整形

和上面的区别不大,仅仅改了赋予值的数据类型而已,现在运行试试。

package com.tipdm.scalaDemoobject p3 {def main(args: Array[String]): Unit = {val p1 = List(11, 22, 33)println(p1)}}
c.::Nil
在scala中,可以使用“Nil”和“::”操作符来定义列表

可以看到,我们并没有定义p1的类型,只是在数值后面加上了::Nil,那输出会是什么呢?

显而易见,我放到这里,那肯定是List,那为什么会这样呢?
Nil代表一个空的List,它是List的结束标记。使用::操作符可以将元素添加到List的前面。 在之前的文章中,我也说过了,这也是Scala的语言的特点,它会自己识别,这正是Scala语言灵活的体现。
2.set
a.set创建
在Scala中,Set是一种不可变的集合,它包含的元素是唯一的,也就是说它不允许有重复的元素。Scala 使用不可变Set集合,若想使用可变的Set集合则需要引入 scala.collection.mutable.Set包。

在运用scala.collection.mutable.Set包创建一个可变集合后,重复元素会直接强制降重,我们来看下输出。

可以看到p2原先的值应该是1,2,2,3,3。现在输出直接变成1,2,3了,它完成了一个降重工作。
b.set操作
你可以使用+和-操作符来添加和删除元素

来看看输出。

对于不可变的Set,添加或删除元素会返回一个新的Set,而原始的Set不会被改变。对于可变的Set,添加或删除元素会修改原来的Set。
c.遍历set
在Scala中,我们可以使用foreach方法来遍历Set中的元素

输出看看

咱们的newp1被遍历输出了。
package com.tipdm.scalaDemoobject p4 {def main(args: Array[String]): Unit = {val p1 = Set(1, 2, 3, 4) val newp1= p1 + 5newp1.foreach(println)}
}
3.map
在Scala中,Map是一种可迭代的键值对(key/value)结构集合,并且键在Map中是唯一的。
创建map,输出map

那该怎么输出呢?
可以通过键来访问Map中的值,也可以直接打印,还可以用for遍历输出

三种方法,我们来看下输出效果

package com.tipdm.scalaDemoobject p4 {def main(args: Array[String]): Unit = {val p1 = Map("one" -> 1, "two" -> 2, "three" -> 3)val p2 = p1("one")println(p2)println(p1)for ((key, value) <- p1) {println(s"$key -> $value")}}
}
三、元组
在Scala中,元组(Tuple)是一种固定大小的有序集合,可以包含不同类型的元素。元组是轻量级的,用于将多个项组合成一个单一的对象,而不必创建自定义的类。
val p1 = (1, "Hello")
这是两种元素的元组
val p2 = (1, "Hello", true, 3.14)
这是四种元素的元组
在元组中,我们可以通过使用下划线 _1、_2、_3 等来访问元组中的元素,其中数字表示元素的位置(从1开始)。也可以直接打印。

来看看运行效果

可以看到_1下的元素1被成功赋给了s1
package com.tipdm.scalaDemoobject p4 {def main(args: Array[String]): Unit = {val p1 = (1, "Hello", true, 3.14)println(p1)val s1 = p1._1println(s1)}}
拓展-集合方法
1.List集合方法
| 方法名 | 描述 | 示例 |
|---|---|---|
::: | 连接两个或多个列表 | val list1 = List(1, 2, 3); val list2 = List(4, 5, 6); val result = list1 ::: list2 |
+: 或 :: | 在列表开头添加元素 | val list = 1 :: (2 :: (3 :: Nil)) |
isEmpty | 判断列表是否为空 | val list = List(); val isEmpty = list.isEmpty |
head | 获取列表的第一个元素 | val list = List(1, 2, 3); val firstElement = list.head |
tail | 获取列表除第一个元素外的其余部分 | val list = List(1, 2, 3); val rest = list.tail |
take(n) | 取出列表的前n个元素 | val list = List(1, 2, 3, 4, 5); val taken = list.take(3) |
takeRight(n) | 取出列表的后n个元素 | val list = List(1, 2, 3, 4, 5); val takenRight = list.takeRight(2) |
drop(n) | 删除列表的前n个元素 | val list = List(1, 2, 3, 4, 5); val dropped = list.drop(2) |
dropRight(n) | 删除列表的后n个元素 | val list = List(1, 2, 3, 4, 5); val droppedRight = list.dropRight(2) |
filter(predicate) | 过滤出符合条件的元素 | val list = List(1, 2, 3, 4, 5); val filtered = list.filter(_ % 2 == 0) |
indexOf(element, [from]) | 从指定位置开始查找元素的索引 | val list = List(1, 2, 3, 4, 5); val index = list.indexOf(3) |
intersect(other) | 计算两个集合的交集 | val list1 = List(1, 2, 3); val list2 = List(2, 3, 4); val intersection = list1.intersect(list2) |
length | 返回列表的长度 | val list = List(1, 2, 3, 4, 5); val length = list.length |
mkString([sep]) | 将列表元素转换为字符串,可以用指定的分隔符 | val list = List(1, 2, 3); val str = list.mkString(", ") |
toArray | 将列表转换为数组 | val list = List(1, 2, 3); val array = list.toArray |
sorted | 对列表进行排序,默认为升序 | val list = List(3, 1, 4, 1, 5, 9); val sortedList = list.sorted |
2.set集合方法
| 方法名 | 描述 | 示例 |
|---|---|---|
+ 或 ++= | 向集合中添加元素 | val set = Set(1, 2, 3); set += 4 |
- 或 --= | 从集合中移除元素 | val set = Set(1, 2, 3, 4); set -= 3 |
contains | 检查集合是否包含某元素 | val set = Set(1, 2, 3); val isContained = set.contains(2) |
isEmpty | 判断集合是否为空 | val set = Set(); val isEmpty = set.isEmpty |
size | 返回集合的元素数量 | val set = Set(1, 2, 3); val size = set.size |
intersect | 计算两个集合的交集 | val set1 = Set(1, 2, 3); val set2 = Set(2, 3, 4); val intersection = set1.intersect(set2) |
diff 或 -- | 计算两个集合的差集 | val set1 = Set(1, 2, 3); val set2 = Set(2, 3, 4); val diff = set1.diff(set2) |
union 或 ++ | 计算两个集合的并集 | val set1 = Set(1, 2, 3); val set2 = Set(2, 3, 4); val union = set1.union(set2) |
subsetOf | 判断一个集合是否为另一个集合的子集 | val set1 = Set(1, 2); val set2 = Set(1, 2, 3); val isSubset = set1.subsetOf(set2) |
filter | 过滤出符合条件的元素 | val set = Set(1, 2, 3, 4, 5); val filtered = set.filter(_ % 2 == 0) |
foreach | 遍历集合中的每个元素并执行操作 | val set = Set(1, 2, 3); set.foreach(println) |
mkString | 将集合元素转换为字符串,可用指定的分隔符 | val set = Set(1, 2, 3); val str = set.mkString(", ") |
3.map集合方法
| 方法名 | 描述 | 示例 |
|---|---|---|
+ 或 ++= | 向Map中添加键值对 | val map = Map("a" -> 1); map += ("b" -> 2) |
- 或 --= | 从Map中移除键值对 | val map = Map("a" -> 1, "b" -> 2); map -= "a" |
get | 根据键获取对应的值(返回Option类型) | val map = Map("a" -> 1); val value = map.get("a") |
contains | 检查Map是否包含某个键 | val map = Map("a" -> 1); val isContained = map.contains("a") |
isEmpty | 判断Map是否为空 | val map = Map(); val isEmpty = map.isEmpty |
size | 返回Map中的键值对数量 | val map = Map("a" -> 1, "b" -> 2); val size = map.size |
keys | 获取Map中所有的键 | val map = Map("a" -> 1, "b" -> 2); val keys = map.keys |
values | 获取Map中所有的值 | val map = Map("a" -> 1, "b" -> 2); val values = map.values |
foreach | 遍历Map中的每个键值对并执行操作 | val map = Map("a" -> 1, "b" -> 2); map.foreach { case (key, value) => println(s"$key -> $value") } |
mapValues | 对Map中的每个值应用函数,返回新的Map | val map = Map("a" -> 1, "b" -> 2); val newMap = map.mapValues(_ * 2) |
filterKeys | 根据键的条件过滤Map中的键值对 | val map = Map("a" -> 1, "b" -> 2); val filtered = map.filterKeys(_ == "a") |
filter 或 withFilter | 根据键值对的条件过滤Map中的键值对 | val map = Map("a" -> 1, "b" -> 2); val filtered = map.filter { case (key, value) => value > 1 } |
相关文章:
Spark-Scala语言实战(4)
在之前的文章中,我们学习了如何在scala中定义无参,带参以及匿名函数。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言…...
ffmpeg不常用命令整理
最近做了许多有关音视频方面的工作,接触了一些不常用的命令,整理分享出来。 1.剪辑视频 ffmpeg -ss 1 -to 4 -accurate_seek -i input.mp4 -c:v copy output.mp4指定从视频中的第1秒开始,到第4秒结束的部分剪辑。 ss:指定开始时…...
怎么理解面向对象?一文带你全面理解
文章目录 1、类和对象(1)面向过程和面向对象初步认识(2)类的引入(3)类的定义(4)类的访问限定符及封装4.1 访问限定符4.2 封装 (5)类的作用域(6&am…...
神经网络(深度学习,计算机视觉,得分函数,损失函数,前向传播,反向传播,激活函数)
目录 一、神经网络简介 二、深度学习要解决的问题 三、深度学习的应用 四、计算机视觉 五、计算机视觉面临的挑战 六、得分函数 七、损失函数 八、前向传播 九、反向传播 十、神经元的个数对结果的影响 十一、正则化与激活函数 一、神经网络简介 神经网络是一种有监督…...
Tomcat的Host Manager页面403的原因和解决办法
目录 背景 原因: 解决方案 背景 一直报错 403 Access Denied You are not authorized to view this page.By default the Host Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, youll need to…...
零基础学华为ip认证难吗?华为认证费用多少?
零基础学华为ip认证难吗? 首先,零基础的学习者可以通过系统的学习,逐步掌握网络基础知识和技能。可以通过阅读教材、参加培训课程、进行实践操作等方式,不断提升自己的知识和技能水平。同时,学习者还可以利用华为提供的…...
[C语言]——内存函数
目录 一.memcpy使用和模拟实现(内存拷贝) 二.memmove 使用和模拟实现 三.memset 函数的使用(内存设置) 四.memcmp 函数的使用 C语言中规定: memcpy拷贝的就是不重叠的内存memmove拷贝的就是重叠的内存但是在VS202…...
QGIS编译(跨平台编译)056:PDAL编译(Windows、Linux、MacOS环境下编译)
点击查看专栏目录 文章目录 1、PDAL介绍2、PDAL下载3、Windows下编译4、linux下编译5、MacOS下编译1、PDAL介绍 PDAL(Point Data Abstraction Library)是一个开源的地理空间数据处理库,它专注于点云数据的获取、处理和分析。PDAL 提供了丰富的工具和库,用于处理激光扫描仪、…...
计算机三级——网络技术(综合题第二题)
路由器工作模式 用户模式 当通过Console或Telnet方式登录到路由器时,只要输入的密码正确,路由器就直接进入了用户模式。在该模式下,系统提示符为一个尖括号(>)。如果用户以前为路由器输入过名称,则该名称将会显示在尖指号的前…...
Python 深度学习第二版(GPT 重译)(二)
四、入门神经网络:分类和回归 本章涵盖 您的第一个真实世界机器学习工作流示例 处理矢量数据上的分类问题 处理矢量数据上的连续回归问题 本章旨在帮助您开始使用神经网络解决实际问题。您将巩固从第二章和第三章中获得的知识,并将所学应用于三个新…...
【Redis】Redis常见原理和数据结构
Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库,读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 redis的数据类型 string:字符串 缓存对象,分布式ID,token,se…...
3个Tips,用“AI”开启新生活
相信最近,很多朋友们都回归到了忙碌的生活节奏中。生活模式的切换,或多或少会带来身体或情绪状况的起伏。新技术正在为人们生活的方方面面带来便利。3个小Tips或许能让你也从新技术中获益,从身到心,用“AI”开启新生活。 关”A…...
【ROS | OpenCV】在ROS中实现多版本OpenCV、cv_bridge共存:安装与配置指南
在 Ubuntu 20.04 中,ROS Noetic 默认安装的 OpenCV 版本为 4.2.0。如果您需要确认系统中已安装的 OpenCV 版本,可以使用以下命令: sudo find / -iname "*opencv*"然而,许多开源算法都是基于 OpenCV 3 编写的࿰…...
Docker容器化技术(docker-compose示例:部署discuz论坛和wordpress博客,使用adminer管理数据库)
安装docker-compose [rootservice ~]# systemctl stop firewalld [rootservice ~]# setenforce 0 [rootservice ~]# systemctl start docker[rootservice ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64创建目录 [rootse…...
微分学<6>——Taylor公式
索引 Taylor公式Taylor公式的定性分析定理6.1 Taylor公式(Peano余项) Taylor公式的定量分析定理6.2 Taylor公式(Lagrange余项) Taylor公式 Taylor公式的定性分析 定理6.1 Taylor公式(Peano余项) 若函数 f ( x ) f\left ( x \right ) f(x)在 x 0 x_{0} x0处的 n n n阶导数均…...
检索增强生成(RAG)应用的构建:LangChain与LlamaIndex的比较与选择
对于我要做RAG应用,我应该使用两者中的哪一个。或者说还是都使用? 在人工智能领域,检索增强生成(RAG)应用正变得越来越受欢迎,因为它们能够结合大型语言模型(LLMs)的自然语言处理能力…...
免费PDF转换和编辑工具 PDFgear 2.1.4
PDFgear是一款功能强大的 PDF 阅读及转换软件。 它支持多种文件格式的转换和编辑,同时还提供了丰富的功能模块,如签名、表单填写等,方便用户进行多样化的操作。 该软件界面简洁美观,操作简单易懂,适合不同层次的用户…...
uniapp,导航栏(切换项)有多项,溢出采取左滑右滑的形式展示
一、实现效果 当有多项的导航,或者说切换项,超出页面的宽度,我们采取可滑动的方式比较好一些!并且在页面右边加个遮罩,模拟最右边有渐变效果! 二、实现代码 html代码: <!-- 头部导航栏 --…...
计算机网络面经-什么是IPv4和IPv6?
前言 Internet协议(IP)是为连接到Internet网络的每个设备分配的数字地址。它类似于电话号码,是一种独特的数字组合,允许用户与他人通信。IP地址主要有两个主要功能。首先,有了IP,用户能够在Internet上被识别…...
彻底讲透:如何写sql能够有效的使用到复合索引?
在MySQL中,有效的使用复合索引需要确保查询条件按照索引定义的列顺序进行。以下是一个具体的例子: 假设我们有一个sales表,它有四个字段:customer_id、product_category、sale_date和amount。为了优化包含这些字段查询的性能&…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
