2023_Spark_实验四:SCALA基础
一、在IDEA中执行以下语句
或者用windows徽标+R 输入cmd 进入命令提示符
输入scala直接进入编写界面
1、Scala的常用数据类型
注意:在Scala中,任何数据都是对象。例如:
scala> 1
res0: Int = 1scala> 1.toString
res1: String = 1scala> "1".toInt
res2: Int = 1scala> "abc".toInt
java.lang.NumberFormatException: For input string: "abc"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:580)at java.lang.Integer.parseInt(Integer.java:615)at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272)at scala.collection.immutable.StringOps.toInt(StringOps.scala:29)... 32 elided
1. 数值类型:Byte,Short,Int,Long,Float,Double
Byte: 8位有符号数字,从-128 到 127
Short: 16位有符号数据,从-32768 到 32767
Int: 32位有符号数据
Long: 64位有符号数据
例如:
val a:Byte = 10
a+10
得到:res9: Int =
这里的res9是新生成变量的名字
val b:Short = 20
a+b
注意:在Scala中,定义变量可以不指定类型,因为Scala会进行类型的自动推导。
2. 字符类型和字符串类型:Char和String
对于字符串,在Scala中可以进行插值操作。
scala> val s1="Hello World"s1: String = Hello Worldscala> "My Name is ${s1}"res4: String = My Name is ${s1}scala> s"My Name is ${s1}"res5: String = My Name is Hello World
3. Unit类型:相当于Java中的void类型
scala> val f=()f: Unit = ()scala> val f={}f: Unit = ()
4. Nothing类型:一般表示在执行过程中,产生了Exception
例如,我们定义一个函数如下:
scala> def myfunction=throw new Exception("Some Error")myfunction: Nothing
2、Scala变量的申明和使用
使用val和var申明变量
例如:scala> val answer = 8 * 3 + 2 可以在后续表达式中使用这些名称
val:定义的值实际是一个常量
要申明其值可变的变量:var
注意:可以不用显式指定变量的类型,Scala会进行自动的类型推到
3、Scala的函数和方法的使用
可以使用Scala的预定义函数
例如:求两个值的最大值
scala> max(1,2)<console>:12: error: not found: value maxmax(1,2)^scala> import scala.math._import scala.math._scala> max(1,2)res7: Int = 2scala> var result:Int=max(1,2)result: Int = 2
也可以使用def关键字自定义函数
语法:
//求两个参数的和def sum(x:Int,y:Int):Int=x+ysum(1,2)var d=sum(1,2)//求每个数学的阶乘def myFactor(x:Int):Int={//采用递归算法得到阶乘//注意:在SCALA 中,if..else 是一个表达式,所有有返回值,相当于省略的returnif (x<=1)1elsex*myFactor(x-1)}myFactor(5)
4、Scala的条件表达式
Scala的if/else语法结构和Java或C++一样。
不过,在Scala中,if/else是表达式,有值,这个值就是跟在if或else之后的表达式的值。
5、Scala的循环
Scala拥有与Java和C++相同的while和do循环
Scala中,可以使用for和foreach进行迭代
使用for循环案例:
//定义一个集合var list=List("Mary","Tom","Mike")println("************for 第一种写法************")for (s<-list) println(s)println("************for 第二种写法************")for {s<-listif(s.length>3)} println(s)println("************for 第三种写法************")for (s<-list if s.length<=3) println(s)
注意:
(*) <- 表示Scala中的generator,即:提取符
(*)第三种写法是第二种写法的简写
在for循环中,还可以使用yield关键字来产生一个新的集合
//定义一个集合var list=List("Mary","Tom","Mike")println("************for 第四种写法************")var newList= for {s<-lists1=s.toUpperCase} yield (s1)
使用while循环:注意使用小括号,不是中括号
println("************while 循环************")var i=0while(i<list.length){println(list(i))i+=1}
使用do ... while循环
println("************do while 循环************")var i=0do {println(list(i))i+=1}while (i<list.length)
使用foreach进行迭代
scala> val list=List("Mary","Tom","Mike")list: List[String] = List(Mary, Tom, Mike)scala> list.foreach(println)MaryTomMike
注意:在上面的例子中,foreach接收了另一个函数(println)作为值
6、Scala函数的参数
Scala中,有两种函数参数的求值策略
Call By Value:对函数实参求值,且仅求一次
Call By Name:函数实参每次在函数体内被用到时都会求值
//Scala中函数参数的求值策略// 1.call by value
def test1(x:Int,y:Int):Int=x+xtest1(3+4,8)//2. call by name
def test2(x: => Int,y: =>Int):Int=x+xtest2(3+4,8)
稍微复杂一点的例子:
x是call by value,y是call by name
def bar(x:Int,y: => Int):Int = 1
定义一个死循环
def loop():Int = loop
调用:
bar(1,loop) //输出1
bar(loop,1) //死循环
我们来分析一下,上面两个调用执行的过程:
Scala中的函数参数
默认参数
代名参数
可变参数
//默认参数def func1(name:String="Tom"):String ="Hello "+namefunc1()func1("marry")//带名参数def func2(str:String="Good Morning",name:String="Tom",age:Int=20)=str+name+" and the age of "+name + " is "+agefunc2()func2(age=25)//变长参数:求多个数字的和def sum(args:Int*)={var result=0for(arg<-args) result+=argresult}
7、Scala的Lazy值(懒值)
当val被申明为lazy时,它的初始化将被推迟,直到我们首次对它取值。
val x:Int =10//定义y的时候才有lazy来休息,在定义它时候不会对其运算lazy val y:Int=x+1//第一次使用的时候,才会对其求值y
一个更为复杂一点的例子:读取文件:
//第一次读取一个存在的文件val words=scala.io.Source.fromFile("d:\\temp\\a.txt").mkStringlazy val words1=scala.io.Source.fromFile("d:\\temp\\a.txt").mkStringwords1//第二次读取一个不存在的文件,这时不会报错lazy val words2=scala.io.Source.fromFile("d:\\temp\\abc.txt").mkString//第一次调用的时候,才会对其运算,才会出现Exceptionwords2
8、异常的处理
Scala异常的工作机制和Java或者C++一样。直接使用throw关键字抛出异常。
使用try...catch...finally来捕获和处理异常:
//1.采用 try catch finally 来捕获异常和处理异常try{val words=scala.io.Source.fromFile("d:\\temp\\abc.txt").mkString} catch {case ex:java.io.FileNotFoundException => {println("File Not Found")}case ex:IllegalArgumentException => {println("Illegal Argument Exception")}case _:Exception =>{println("*****Other Exception ****")}}finally {println("****** final block ******")}//2.如果一个函数的返回类型是Nothing, 表示:在函数执行的过程中产生异样def func1()=throw new IllegalArgumentException("Some Error Happened")//3.if else 语句:如果在一个分支中产生了异常,则另外一个分支的返回值,将作为 if else 返回值的类型val x=10if(x>10){scala.math.sqrt(x)}else{throw new IllegalArgumentException("The value should be not")}
9、Scala中的数组
Scala数组的类型:
定长数组:使用关键字Array
//定长数组val a=new Array[Int](10)val b=new Array[String](5)val c=Array("Tom","Mary","Mike")
变长数组:使用关键字ArrayBuffer
//变长数组: ArrayBufferval d = scala.collection.mutable.ArrayBuffer[Int] ()//往变长数组中加入元素d+=1d+=2d+=3//往变长数组中加入多个元素d+=(10,12,13)//去掉最后两个值d.trimEnd(2)d.trimStart(2)//将ArrayBuffer 转换成Arrayd.toArray
遍历数组
//遍历数组var a=Array("Tom","Mary","Mike")//使用for 循环进行遍历for (s<-a) println(s)//对数组进行转换,新生成一个数组 yieldval b = for {s<-as1=s.toUpperCase}yield (s1)//可以使用foreach进行循环输出a.foreach(println)b.foreach(println)
Scala数组的常用操作
import scala.collection.mutable.ArrayBufferval myArray = Array(1,10,2,3,5,4)//求最大值myArray.max//求最小值myArray.min//求和myArray.sum//定义一个变长数组var myArray1=ArrayBuffer(1,10,2,3,5,4)//排序myArray1.sortWith(_ > _)//升序myArray1.sortWith(_ < _)
Scala的多维数组
和Java一样,多维数组是通过数组的数组来实现的。
也可以创建不规则的数组,每一行的长度各不相同。
//定义一个固定长度的二维数组val matrix = Array.ofDim[Int](3,4)matrix(1)(2)=10matrix//定义一个二维数组,其中每个元素是一个一维数组,其长度不固定val triangle = new Array[Array[Int]](10)//通过一个循环赋值for(i<-0 until( triangle.length)) triangle(i)=new Array[Int](i+1)//观察这个二维数组中的每一个元素的长度triangle
10、映射
映射就是Map集合,由一个(key,value)组成。
-> 操作符用来创建
映射的类型分为:不可变Map和可变Map
//不可变得Mapval math = scala.collection.immutable.Map("Alice"->80,"Bob"->95,"Mary"->70)//可变的Mapval english = scala.collection.mutable.Map("Alice"->80,"Bob"->95,"Mary"->70)val chinese = scala.collection.mutable.Map(("Alice",80),("Bob",95),("Mary",70))
映射的操作
获取映射中的值
//1.获取Map中的值chinese("Bob") //chinese.get("Bob")//chinese("Tom") 如果不存在,会抛出 Exception//Map.constains 判断可以时候存在if(chinese.contains("Alice")){chinese("Alice")}else{-1}//简写chinese.getOrElse("Alice",-1)
迭代映射
//迭代映射for (s<-chinese) println(s)chinese.foreach(println)
11、元组(Tuple)
元组是不同类型的值的聚集。
例如:val t = (1, 3.14, "Fred") // 类型为Tuple3[Int, Double, java.lang.String]
这里:Tuple是类型,3是表示元组中有三个元素。
元组的访问和遍历:
//定义tuple,包含3个元素val t1=(1,2,"Tom")val t2= new Tuple4("Mary",3.14,100,"Hello")//访问tuple中的组员 _1t2._1t2._2t2._3t2._4//t2._5 ---->error//遍历 Tuple: for foreach ???t2.productIterator.foreach(println)//注意:要遍历Tuple中的元素,需要首先生成对应的迭代器,不能直接使用for 或者 foreach
相关文章:

2023_Spark_实验四:SCALA基础
一、在IDEA中执行以下语句 或者用windows徽标R 输入cmd 进入命令提示符 输入scala直接进入编写界面 1、Scala的常用数据类型 注意:在Scala中,任何数据都是对象。例如: scala> 1 res0: Int 1scala> 1.toString res1: String 1scala…...
【深入解析spring cloud gateway】04 Global Filters
上一节学习了GatewayFilter。 回忆一下一个关键点: GateWayFilterFactory的本质就是:针对配置进行解析,为指定的路由,添加Filter,以便对请求报文进行处理。 一、原理分析 GlobalFilter又是啥?先看一下接口…...
c++搜索基础进阶
搜索算法基础 搜索算法是利用计算机的高性能来有目的的穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。 所有的搜索算法从其最终的算法实现上来看&#…...

管网水位监测的必要性
城市燃气、桥梁、供水、排水、热力、电力、电梯、通信、轨道交通、综合管廊、输油管线等,担负着城市的信息传递、能源输送、排涝减灾等重要任务,是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市的生命线。基础设施生命线就像…...

无涯教程-Android - 系统架构
Android操作系统是一堆软件组件,大致分为五个部分和四个主要层,如体系结构图中所示。 Linux内核 底层是Linux-Linux 3.6,带有大约115个补丁,这在设备硬件之间提供了一定程度的抽象,并且包含所有必需的硬件驱动程序&am…...
await接受成功的promise,失败的promise用try catch
在 JavaScript 中,await 关键字用于等待一个 Promise 对象的解决(fulfillment)。下面是一个示例: async function example() {try {const result await doSomethingAsync();console.log(result); // 如果 Promise 成功解决&…...

赞奇科技参与华为云828 B2B企业节,云工作站入选精选产品解决方案
8月27日,由华为云携手上万家伙伴共同发起的第二届 828 B2B 企业节拉开帷幕,围绕五大系列活动,为万千中小企业带来精细化商机对接。 聚焦行业数字化所需最优产品,举办超1000场供需对接会,遍及20多个省100多个城市&…...

Docker私有镜像仓库(Harbor)安装
Docker私有镜像仓库(Harbor)安装 1、什么是Harbor Harbor是类似与DockerHub 一样的镜像仓库。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Docker容器应用的…...

【深入解析spring cloud gateway】06 gateway源码简要分析
上一节做了一个很简单的示例,微服务通过注册到eureka上,然后网关通过服务发现访问到对应的微服务。本节将简单地对整个gateway请求转发过程做一个简单的分析。 一、核心流程 主要流程: Gateway Client向 Spring Cloud Gateway 发送请求请求…...

2023年行研行业研究报告
第一章 行业概述 1.1 行研行业 行业定义为同一类别的经济活动,这涉及生产相似产品、应用相同生产工艺或提供同类服务的集合,如食品饮料行业、服饰行业、机械制造行业、金融服务行业和移动互联网行业等。 为满足全球金融业的需求,1999年8月…...

linux上vscode中.cpp文件中引入头文件.hpp时报错:找不到头文件(启用错误钵形曲线)
当在.cpp文件中引入系统给定的头文件时:#include < iostream > 或者引入自定义的头文件 :#include <success.hpp> 报错:找不到相应的头文件,即在引入头文件的改行底下标出红波浪线 解决方法为: &#…...
Sphinx Docstring
入门 — Sphinx documentation pip install sphinx pip install sphinx-rtd-themesphinx-quickstartexport PYTHONPATH"-"make html cd build/htmlpython -m http.server 9121nohup python -m http.server 9121 &...

JVM的故事——虚拟机类加载机制
虚拟机类加载机制 文章目录 虚拟机类加载机制一、概述二、类加载的时机三、类加载的过程四、类加载器 一、概述 本章将要讲解class文件如何进入虚拟机以及虚拟机如何处理这些class文件。Java虚拟机把class文件加载到内存,并对数据进行校验、转换解析和初始化&#…...

Sentry 是一个开源的错误监控和日志聚合平台-- 通过docker-compose 安装Sentry
概述 Sentry 是一个开源的错误监控和日志聚合平台,用于帮助开发团队实时监控和调试应用程序中的错误和异常。它可以捕获应用程序中的错误和异常,并提供详细的错误报告,包括错误堆栈跟踪、环境信息、用户信息等。这些报告可以帮助开发团队快速…...

Redis 7 第六讲 主从模式(replica)架构篇
🌹🌹🌹 此篇开始进入架构篇范围(❤艸`❤) 理论 即主从复制,master以写为主,Slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。 使用场景 读写分离 容灾备份数据备份水平扩容主从架构 演示案例 注:masterauth、replicaof主…...

学习资源记录 =0=
学习路线: 无人机学习路线 无人机学习路线2 自主无人机: 浙大fastlab无人机 机器人理论: 华中科技大学机器人学 C课程 机器人仿真: 2023gazebo仿真开发四足机器人...
Python import包路径管理
import sys sys.path.insert(0, "../")详细链接...

OB Cloud助力泡泡玛特打造新一代分布式抽盒机系统
作为中国潮玩行业的领先者,泡泡玛特凭借 MOLLY、DIMOO、SKULLPANDA 等爆款 IP,以及线上线下全渠道营销收获了千万年轻人的喜爱,会员数达到 2600 多万。2022 年,泡泡玛特实现 46.2 亿元营收,其中线上渠道营收占比 41.8%…...

Linux socket网络编程实战(tcp)实现双方聊天
在上节已经系统介绍了大致的流程和相关的API,这节就开始写代码! 回顾上节的流程: 创建一个NET文件夹 来存放网络编程相关的代码: tcp服务端代码初步实现--上 这部分先实现服务器的连接部分的代码并进行验证 server1.cÿ…...

BuhoCleaner for mac:让你的Mac重获新生
你是否曾经因为电脑运行缓慢而感到困扰?是否曾经因为大量的垃圾文件和无效的临时文件而感到头疼?如果你有这样的烦恼,那么BuhoCleaner for mac就是你的救星! BuhoCleaner for mac是一款专门为Mac用户设计的系统清理工具ÿ…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...