Spark大数据分析与实战笔记(第一章 Scala语言基础-5)
文章目录
- 每日一句正能量
- 章节概要
- 1.5 Scala的模式匹配与样例类
- 1.5.1 模式匹配
- 字符匹配
- 匹配字符串
- 守卫
- 匹配类型
- 匹配数组、元组、集合
- 1.5.2 样例类
- 课外补充
- 偏函数
每日一句正能量
“成功的秘诀,在于对目标的执着追求。”——爱迪生
无论是在工作、学习、还是生活中,只有对目标有着真正的执着追求,才有可能取得成功。爱迪生是个成功的发明家,也是一个努力不懈、坚持不断的实践者。他曾说过:“没有人能够一次成功,成功的秘诀就在于多次失败后依然不放弃对目标的执着追求。”
所以,只有对自己的目标有着强烈的追求,才能在取得成果的路上坚持不懈地去奋斗,才能不怕失败,不放弃,不断地提高自己的能力和技巧。每一次失败都是向成功更近一步的机会,只要时刻保持目标的执着追求,坚信自己一定能够取得成功,就一定会迈向胜利。
章节概要
Spark是专为大规模数据处理而设计的快速通用的计算引擎,它是由Scala语言开发实现的,关于大数据技术,本身就是计算数据,而Scala既有面向对象组织项目工程的能力,又具备计算数据的功能,同时Spark和Scala的紧密集成,本书将采用Scala语言开发Spark程序,所以学好Scala将有助于我们更好的掌握Spark框架。
1.5 Scala的模式匹配与样例类
Scala提供了强大的模式匹配机制,最常见的模式匹配就是math语句,主要应用于从多个分支中进行选择的场景。
1.5.1 模式匹配
- Scala中的模式匹配是由match case组成,它类似于Java中的switch case。
- match关键字主要用来描述一个表达式,位于表达式位置的后面。
- case关键字主要用来描述和表达式结果进行比较后的模式。
创建模式匹配的语法格式如下:
表达式 match {case 模式1 => 语句1case 模式2 => 语句2case 模式3 => 语句3
}
下面,定义一个方法matchTest(),方法的参数是一个整形字段,而方法的调用则是对参数进行模式匹配,若参数匹配的是1,则打印输出“one”;若参数匹配的是2,则打印输出“two”;若参数匹配的是_,则打印输出“many”,具体实现代码如下所示。
package cn.itcast.scalaobject Ch12_PatternMatch {def main(args: Array[String]): Unit = {println(matchTest(5))}//模式匹配def matchTest(x:Int):String = x match{case 1 => "one"case 2 => "two"case _ => "many"}
}
结果如下图所示:
字符匹配
def main(args: Array[String]): Unit = {val charStr = '6'charStr match {case '+' => println("匹配上了加号")case '-' => println("匹配上了减号")case '*' => println("匹配上了乘号")case '/' => println("匹配上了除号")//注意。所有的模式匹配都必须最终匹配上一个值,如果没有匹配上任何值,就会报错// case _ => println("都没有匹配上,我是默认值")}}
匹配字符串
def main(args: Array[String]): Unit = {val arr = Array("hadoop", "zookeeper", "spark")val name = arr(Random.nextInt(arr.length))name match {case "hadoop" => println("大数据分布式存储和计算框架...")case "zookeeper" => println("大数据分布式协调服务框架...")case "spark" => println("大数据分布式内存计算框架...")case _ => println("我不认识你...")}}
守卫
模式匹配当中,我们也可以通过条件进行判断def main(args: Array[String]): Unit = {var ch = "500"var sign = 0ch match {case "+" => sign = 1case "-" => sign = 2case _ if ch.equals("500") => sign = 3case _ => sign = 4}println(ch + " " + sign)
}
匹配类型
def main(args: Array[String]): Unit = {//注意泛型擦除,在模式匹配当中的类型匹配中,除了Array类型以为,所有的其他的数据类型都会被擦除掉val a = 3val obj = if(a == 1) 1else if(a == 2) "2"else if(a == 3) BigInt(3)else if(a == 4) Map("aa" -> 1)else if(a == 5) Map(1 -> "aa")else if(a == 6) Array(1, 2, 3)else if(a == 7) Array("aa", 1)else if(a == 8) Array("aa")val r1 = obj match {case x: Int => xcase s: String => s.toIntcase BigInt => -1 //不能这么匹配case _: BigInt => Int.MaxValuecase m: Map[String, Int] => "Map[String, Int]类型的Map集合"case m: Map[_, _] => "Map集合"case a: Array[Int] => "It's an Array[Int]"case a: Array[String] => "It's an Array[String]"case a: Array[_] => "It's an array of something other than Int"case _ => 0}println(r1 + ", " + r1.getClass.getName)}
匹配数组、元组、集合
def main(args: Array[String]): Unit = {val arr = Array(0, 3, 5)arr match {case Array(0, x, y) => println(x + " " + y)case Array(0) => println("only 0")//匹配数组以1 开始作为第一个元素case Array(1, _*) => println("0 ...")case _ => println("something else")}val lst = List(3, -1)lst match {case 0 :: Nil => println("only 0")case x :: y :: Nil => println(s"x: $x y: $y")case 0 :: tail => println("0 ...")case _ => println("something else")}val tup = (1, 3, 7)tup match {case (1, x, y) => println(s"1, $x , $y")case (_, z, 5) => println(z)case _ => println("else")}
}
注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
1.5.2 样例类
- 在Scala中,使用case关键字来定义的类被称为样例类。
- 样例类是一种特殊的类,经过优化可以被用于模式匹配。
样例类首先是类,除此之外它是为模式匹配而优化的类,样例类用case关键字进行声明。样例类主要是使用在我们后面的sparkSQL当中,通过样例类来映射我们的表当中的对象
定义形式:
- case class 类型,是多例的,后面要跟构造参数。形式如下。
case class Student(name:String)
- case object 类型,是单例的。 形式如下。
case object Person
下面,使用case关键字来定义样例类Person,并将该样例类应用到模式匹配中,具体代码如下所示。
package cn.itcast.scalaobject Ch13_CaseClass {//定义样例类case class Person(name:String,age:Int)def main(args: Array[String]): Unit = {//创建样例类对象val alice = new Person("Alice", 25)val bob = new Person("Bob", 32)val charlie = new Person("Charlie", 33)//val tom = Person("tom",26) //这种方式创建也可以for(person <- List(alice,bob,charlie)){//模式匹配person match {case Person("Alice",25) => println("Hi Alice")case Person("Bob", 32) => println("Hi Bob")case Person("Charlie", 33) => println("Hi Charlie")//找不到以上匹配时case Person(name,age) => println("Name:"+name+"\t"+"Age:"+age)}}}
}
结果如下图所示:
课外补充
偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。
val func1: PartialFunction[String, Int] = {case "one" => 1case "two" => 2// case _ => -1}def func2(num: String) : Int = num match {case "one" => 1case "two" => 2case _ => -1}def main(args: Array[String]) {println(func1("one"))println(func2("one"))//如果偏函数当中没有匹配上,那么就会报错,我们可以通过isDefinedAt来进行判断// println(func1("three"))println(func1.isDefinedAt("three"))if(func1.isDefinedAt("three")){println("hello world")}else{println("world hello")}
}
转载自:https://blog.csdn.net/u014727709/article/details/133977059
欢迎start,欢迎评论,欢迎指正
相关文章:

Spark大数据分析与实战笔记(第一章 Scala语言基础-5)
文章目录 每日一句正能量章节概要1.5 Scala的模式匹配与样例类1.5.1 模式匹配字符匹配匹配字符串守卫匹配类型匹配数组、元组、集合 1.5.2 样例类 课外补充偏函数 每日一句正能量 “成功的秘诀,在于对目标的执着追求。”——爱迪生 无论是在工作、学习、还是生活中&…...

shell学习脚本04(小滴课堂)
他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容: 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话: 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。...

Python数据结构(链表)
Python数据结构(链表) 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向…...

连续/离散的控制系统阶跃测试(包括MATLAB里的step()函数)
阶跃测试 只要是连续时间系统,无论是传递函数还是连续状态空间形式的模型,直接可以用**step()**做阶跃测试;但是对于离散系统而言,不能用step()函数,可以自行编写代码,如下。 1、离散系统:x(k…...

【六:pytest框架介绍】
常见的请求对象requests.get()requests.post()requests.delete()requests.put()requests.request()常见的响应对象reprequests.request()//返回字符串格式数据print(req.text)//返回字节格式数据print(req.content)//返回字典格式数据print(req.json)#状态码print(req.status_c…...

提升医院安全的关键利器——医院安全(不良)事件报告系统源码
医院是人们寻求医疗服务和康复的场所,安全是医院运营的基石。然而,医疗过程中不可避免地会出现不良事件,如药物错误、手术事故等。为了及时发现、评估和解决这些问题,医院安全(不良)事件报告系统应运而生。…...

【瑞吉外卖部分功能补充】
瑞吉外卖部分功能补充 菜品的启售和停售 在浏览器控制台点击对应功能后可以看到前端发送的请求是:http://localhost:9999/dish/status/1?ids1413342036832100354,请求方式为POST。 接收到前端参数后,进行controller层代码补全,…...

react的setState做了什么
1、为什么需要setState setState的作用是帮助我们更改数据的同时并且通知视图进行渲染。因为React并不会绑定视图和state,需要我们手动去更新视图。 2、setState什么时候是同步的,什么时候是异步的 setState这个方法在调用的时候是同步的,…...

ubuntu18.04 RTX3060 rangnet++训练 bonnetal语义分割
代码链接: https://github.com/PRBonn/lidar-bonnetal 安装anaconda环境为 CUDA 11.0(11.1也可以) anaconda环境如下 numpy1.17.2 torchvision0.2.2 matplotlib2.2.3 tensorflow1.13.1 scipy0.19.1 pytorch1.7.1 vispy0.5.3 opencv_python…...

Linux:权限是什么
本篇文章来简单介绍一下Linux操作系统中权限的基本概念和一些操作方法,对Linux权限有一个基本的了解,希望对大家学习Linux有所帮助。 目录 1.权限的概念 2.Linux权限管理 2.1 文件访问者的分类 2.2 文件类型与访问权限(事物属性ÿ…...
uni-app yrkDataPicker 日期和时间选择控件
uni-app 选择日期时间控件有 2 月份有 31 天的问题,一直没有修复,uni-calendar 苹果有选择年份和月份后无法显示问题。自己写了一个,只支持 H5 和微信小程序,其他没有试过。 <template><view class"yrk-data-picke…...

PAM从入门到精通(十九)
接前一篇文章:PAM从入门到精通(十八) 本文参考: 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构: 更加形象的形式: 六、整体流程示例 2.…...

apache httpd 多后缀解析漏洞
形成原因 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令 在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单…...
Flutter ☞ 数据类型
数值类型 int、double、num int 整型,取值通常在 -253 ~ 253 之间 int class double 64-bt(双精度)浮点数,符合 IEEE 754 标准。 double class num 数值类型的基类,int 和 double 都继承自num。 num class 数值转换 // String -> …...

MyBatis-Plus 实战教程一
这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,…...

闭包(函数)
把内部函数通过return扔出去 必要条件...

Go包介绍与初始化:搞清Go程序的执行次序
Go包介绍与初始化:搞清Go程序的执行次序 文章目录 Go包介绍与初始化:搞清Go程序的执行次序一、main.main 函数:Go 应用的入口函数1.1 main.main 函数1.2 main.main 函数特点 二、包介绍2.1 包介绍与声明2.2 非 main包的 main 函数2.3 包的命名…...

Python教程(15)——Python流程控制语句详解
目录 if语句else if语句for循环遍历类型range关键字 while循环break语句continue语句 Python流程控制是Python编程中非常重要的一部分,它用于控制程序的执行流程。Python提供了多种流程控制语句,包括if语句、while循环、for循环、break和continue语句等。…...

JavaScript基础知识16——分支语句
哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…...

web开发初级工程师学习笔记
web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中,你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...