scala基础内容 函数,懒值,数组

立创开源Link Hub多功能USB扩展坞:CH339F主控+4层板设计,实测网口/存储性能 本文深度评测了立创开源Link Hub多功能USB扩展坞,其采用CH339F主控芯片与4层PCB板设计,并严格进行阻抗匹配。实测表明,该扩展坞的USB接口与microSD读卡器性能均接近USB 2.0理论极限,百兆以太网口转换效率高,性能损失极小。设计上注重电源保护与信号完整性,是一个兼顾稳定性与成本的高完成度开源硬件项目。 阅读详情

函数(def)

/*
def 定义函数的关键字
name 形参
String 数据类型
: 执行语句
*/
def fun1(name:String):String="Hello:"+name;

在这里插入图片描述

函数参数的求值策略

call by value:当实参赋值给形参之后,就直接求值,只求一次值
call by name:当实参赋值给形参之后,并不直接求值,而是在调用的时候才会求值
代码举例:

		scala> def test1(x:Int,y:Int) : Int = x+x
		test1: (x: Int, y: Int)Int

		scala> test1(3+4,8)
		res0: Int = 14

		scala> def test2(x: => Int,y: => Int) : Int = x+x
		test2: (x: => Int, y: => Int)Int

		scala> test2(3+4,8)
		res1: Int = 14

在这里插入图片描述
执行过程讲解:
test1和test2显示的值是一样的,都是14,但是执行的策略确实不相同的
test1是当3+4赋值给x的时候,就直接计算出结果为7,当调用test1的时候,进行的是x+x的操作,得出结果为14
test2则是当3+4赋值给x的时候,x等于3+4,并没有进行计算,只有到调用test2的时候,才会将x+x操作中的x替换为3+4,即x+x转换为(3+4)+(3+4),然后得到结果为14

举例:
x 是 call by value , y 是 call by name

	def bar(x:Int,y: => Int) : Int = 1
	
	定义一个死循环函数
	def loop() : Int = loop
	
	调用 bar 函数:
	1、bar(1,loop)
	2、bar(loop,1)
	
	哪种方式会产生死循环?
	第二种方式
	解析:
	1、y 每次在函数中用到时,才会被求值,bar函数没有用到y,所以不会调用loop。
	2、x call by value ,对函数参数求值,并且只求一次,所以会产生死循环。

Scala中函数参数的类型

默认参数

当调用函数的时候,没有进行赋值,则使用默认值

//设置默认参数为aaa
scala> def fun1(name:String="aaa"):String="Hello:"+name;
fun1: (name: String)String
//当没有传实参的时候,使用默认值
scala> fun1()
res5: String = Hello:aaa
//当传递实参的时候,使用传递的实参
scala> fun1("sdfsdf")
res6: String = Hello:sdfsdf

在这里插入图片描述

代名参数

当有多个默认参数的时候,通过代名参数可以确定是给那个参数赋值

scala> def fun1(no:Int=1,name:String="aaa"):String=no + " : "+name;
fun1: (no: Int, name: String)String

scala> fun1()
res7: String = 1 : aaa

scala> fun1(no=3)
res8: String = 3 : aaa

scala> fun1(name="hahaha")
res9: String = 1 : hahaha

scala> fun1("hahaha")
<console>:13: error: type mismatch;
 found   : String("hahaha")
 required: Int
 fun1("hahaha")

在这里插入图片描述

可变参数

类似于java中的可变参数,即参数数量不固定

scala> def sum(args:Int*) = {
     | var result = 0
     | for(s <- args) result += s
     | result}
sum: (args: Int*)Int

scala> sum(1,2,3)
res0: Int = 6

在这里插入图片描述

懒值(lazy)

定义:如果变量是lazy的,他的初始化会被延迟,推迟到第一次使用该常量的时候
个人感觉跟函数中的call by name类似

scala> val a : Int = 10
a: Int = 10
//y不是lazy,在定义后直接进行计算
scala> val b : Int = a+10
b: Int = 20
//z是lazy,所以在定以后没有直接进行计算
scala> lazy val z : Int = b + a
z: Int = <lazy>
//而是在调用的会后才进行计算
scala> z
res3: Int = 30

在这里插入图片描述
铺垫:
Spark的核心是RDD(数据集合),Spark提供很多方法,操作RDD,算子。
算子分为两种:
1、Transformation : 延时加载,不会触发计算
2、Action : 会触发计算

对比:使用lazy读取一个不存在的文件

//不使用lazy读取一个不存在的文件,会产生异常
scala> val words = scala.io.Source.fromFile("H:\\tmp_files\\studen1231312312t.txt").mkString
	java.io.FileNotFoundException: H:\tmp_files\studen1231312312t.txt (系统找不到指定的文件。)
	  at java.io.FileInputStream.open0(Native Method)
	  at java.io.FileInputStream.open(FileInputStream.java:195)
	  at java.io.FileInputStream.<init>(FileInputStream.java:138)
	  at scala.io.Source$.fromFile(Source.scala:91)
	  at scala.io.Source$.fromFile(Source.scala:76)
	  at scala.io.Source$.fromFile(Source.scala:54)
	  ... 32 elided

//使用lazy读取一个不存在的文件,不会产生异常,只有在调用words的时候才会出现异常
scala> lazy val words = scala.io.Source.fromFile("H:\\tmp_files\\studen1231312312312t.txt").mkString
	words: String = <lazy>

在这里插入图片描述

数组(Array)

数组创建之后的默认值

整形(Int)默认值是0
字符串(String)默认值是null
浮点数(Double)默认值是0.0

scala> val a = new Array[Int](10)
a: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

scala> val b = new Array[String](15)
b: Array[String] = Array(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null)

scala> val c = new Array[Double](10)
c: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)

在这里插入图片描述

未声明数据类型和已声明数据类型

未声明 Array类型,直接赋值,Array中是Any类型,即任何类型都可以

//当未声明数据类型时,写入了多种数据类型的数据,则生成的数组的数据类型为Any
scala> val d = Array("tom",1.21)
d: Array[Any] = Array(tom, 1.21)
//当未声明的数据类型时,写入同一种数据类型的数据,则生成对应类型的数组
scala> val e = Array("a","b","d")
e: Array[String] = Array(a, b, d)
//当已经声明数据类型时,写入对应类型数据
scala> val f:Array[Int] = Array(1,2,3,4)
f: Array[Int] = Array(1, 2, 3, 4)
//当已经声明数据类型时,写入多种数据类型的数据,会报错
scala> val f:Array[Int] = Array(1,2,3,1.1)
<console>:11: error: type mismatch;
 found   : Double(1.1)
 required: Int
val f:Array[Int] = Array(1,2,3,1.1)

在这里插入图片描述

变长数组(ArrayBuffer)

变长数组在定义之前,需要先引入scala.collection.mutable._,否则会报错

        //不引入scala.collection.mutable._,会报错
		scala> val g = ArrayBuffer[Int]()
		<console>:11: error: not found: value ArrayBuffer
			   val g = ArrayBuffer[Int]()
					   ^
		//引入scala.collection.mutable._,mutable代表可变
		scala> import scala.collection.mutable._
		import scala.collection.mutable._
		//引入之后创建变长数组成功
		scala> val g = ArrayBuffer[Int]()
		g: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
		//使用 += 往数组中添加数据
		scala> g += 1
		res7: g.type = ArrayBuffer(1)
		//使用 += 往数组中添加多个数据
		scala> g += (1,2,3,4)
		res8: g.type = ArrayBuffer(1, 1, 2, 3, 4)

在这里插入图片描述

使用for,foreach遍历数组

scala> for(s <- g)println(s)
1
1
2
3
4
//推荐使用foreach
scala> g.foreach(println)
1
1
2
3
4

在这里插入图片描述

数组常见操作

scala> val myarray = Array(1,2,7,8,10,3,6)
			myarray: Array[Int] = Array(1, 2, 7, 8, 10, 3, 6)
			//取最大值
			scala> myarray.max
			res16: Int = 10
			//取最小值
			scala> myarray.min
			res17: Int = 1
			//降序排序
			scala> myarray.sortWith(_>_)
			res18: Array[Int] = Array(10, 8, 7, 6, 3, 2, 1)
			//升序排序
			scala> myarray.sortWith(_<_)
			res19: Array[Int] = Array(1, 2, 3, 6, 7, 8, 10)

解释:myarray.sortWith(>)
完整:myarray.sortWith((a,b)=>{if(a>b) true else false})
(a,b)=>{if(a>b) true else false} 是匿名函数,没有名字,传入两个参数 a b,返回值是bool
sortWith(>) 是高阶函数,即参数是函数

多维数组

和Java一样,通过数组的数组来实现

//定义一个定长二维数组,ofDim代表在创建的时候直接打印
scala> val matrix = Array.ofDim[Int](3,4)
matrix: Array[Array[Int]] = Array(Array(0, 0, 0, 0), Array(0, 0, 0, 0), Array(0, 0, 0, 0))
//定义一个定长二维数组
scala> val matrix1 = Array[Int](3,4)
matrix1: Array[Int] = Array(3, 4)
//更改其中的一个值
scala> matrix(1)(2)=10
//打印出来
scala> matrix
res22: Array[Array[Int]] = Array(Array(0, 0, 0, 0), Array(0, 0, 10, 0), Array(0, 0, 0, 0))
//定义一个变长数组
scala> var triangle = new Array[Array[Int]](10)
triangle: Array[Array[Int]] = Array(null, null, null, null, null, null, null, null, null, null)
//打印初始值,Array初始值为null
scala> triangle
res23: Array[Array[Int]] = Array(null, null, null, null, null, null, null, null, null, null)
//往数组中插入数据
scala> for(i <- 0 until triangle.length)
     | triangle(i)=new Array[Int](i+1)
//打印数组内容(下面的内容是手动换行的)
scala> triangle
res25: Array[Array[Int]] = Array(
Array(0), 
Array(0, 0), 
Array(0, 0, 0), 
Array(0, 0, 0, 0), 
Array(0, 0, 0, 0, 0), 
Array(0, 0, 0, 0, 0, 0), 
Array(0, 0, 0, 0, 0, 0, 0),
Array(0, 0, 0, 0, 0, 0, 0, 0), 
Array(0, 0, 0, 0, 0, 0, 0, 0, 0), 
Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
CPU 访问外设的两种核心机制:MMIO(Memory-Mapped I/O) 和 DMA(Direct Memory Access) BAR和DMA是计算机系统中两种关键的数据传输机制:BAR(基址寄存器)用于CPU与设备间的控制通信,映射设备寄存器便于配置操作;而DMA(直接内存访问)允许设备直接读写系统内存,无需CPU参与大量数据传输。典型场景如NVMe SSD读取数据时,CPU通过BAR下发指令,设备通过DMA高效传输数据到主机内存,最后中断通知CPU。虽然BAR能映射大内存空间,但仍无法替代DMA的高效数据传输功能,两者各司其职——BAR负责控制,DMA专注数据传输,共同实现高性能的硬件交互。 阅读详情

相关推荐

企业如何利用群晖 NAS 构建高效数据备份与容灾体系

群晖 NAS 不仅是一个企业级文件存储设备,更是一个完整的数据保护平台。通过 Active Backup for Business、快照技术和多层次容灾方案,企业可以在确保数据安全的同时,实现业务的高可用与持续性。在当今充满不确定性的环境下,企业应将数据备份与容灾体系作为 IT 战略的重要组成部分,而群晖 NAS 则是一个值得信赖的核心基石。

Trihawk的博客 491

Scala的懒值以及使用

scala懒值的使用与意义

csdn1949_406的博客 378

(nginx) nginx5 nginx https部署实战

综上所述,相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全。所以在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络稳定,建议大家多多推广HTTPS。SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐HTTPS 降低用户访问速度(多次握手)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)

weixin_50382197的博客 1505

Scala数组函数总结

Scala 数组函数 数组是一种可变的、可索引的数据集合。在Scala中用Array[T]的形式来表示Java中的数组形式 T[]。 ##变量:赋值后可以改变,生命周期中可以被多次赋值 ##常量:赋值后不变,类似Java中的final变量 ##Scala会根据你输入的值推断输入的类型 scala> var k =300 k: Int = 300 scala> var k ="300" k: String = 300 scala> k ="ggg" k: String = ggg sc

Lymtics_Kevin的博客 1652

HX720/HX711 数据采集实战:从硬件配置到姿态解析(附源码详解)

本文详细解析了HX720/HX711数据采集传感器的硬件配置与姿态解析实战技巧,包括选型指南、电路设计避坑、抗干扰方案及源码实现。通过优化驱动代码和数据处理算法,提升采样率与精度,适用于动态称重和工业检测等场景。附源码详解,助力开发者快速掌握高精度数据采集技术。

weixin_30752699的博客 655

OV5640调试大坑,关于binning、RES分辨率与EV曝光

OV5640在使用binning模式时,必须考虑使用场景,分辨率下降叠加动态范围压缩,会使目标对象细节在高光环境下大量丢失,2x2的binning模式,分辨率会远低于感光面积的1/4。

chongyun_的专栏 1822

大数据系列—— Scala的初步认识和语法入门

1. Scala简介 Scala是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性 Scala运行在Java虚拟机上,并兼容现有的Java程序 (Scala是类Jvm言) Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库 Spark和flink等大数据框架都是使用Scala开发的 2. Sc...

qq_31683033的博客 867

VFIO框架源码分析(二十一)- IOMMUFD 模式下的 DMA 映射机制

在虚拟化 I/O 的世界里,无论上层管理面(如对象模型、设备绑定)如何重构,数据面最核心的任务始终未变——DMA 映射(DMA Mapping)。即如何建立 Guest Physical Address (GPA) 到 Host Physical Address (HPA) 的映射关系,并将其填入 IOMMU 的硬件页表中,使得直通设备能够正确访问虚拟机内存。在 Legacy VFIO (Type1) 时代,这一职责由承担,它通过ioctl 操作 Container。

qq_36071928的博客 1007

Scala(二) 基础语法

一 创建Main类 右键src/main/scala -> New -> Scala Class -> 输入名称,Kind选择Object,在类中输入mian会有提示回车就定义了一个main方法的签名 Scala对比与一下Java,给人的感觉就是换了一种书写形式而已,Scala使用def关键字来定义方法,就像Javascript使用function关键字来定义函数一样,都是用一...

人不风流枉少年 1036

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 904

echarts 饼图(加载进度条动画效果)

1、外侧动画细线效果运动“custom”自定义系列中“renderItem”属性来实现,动态修改起始角度和终止角度。2、圆环使用" pie "类型添加两个data值来画百分比圆环,动态修改data中的值。

God's asylum的博客 1630

scala集合中的函数详解大全(一)

0 目录 1.foreach函数 2.map函数 3.filter和filterNot(过滤函数) 4.collect函数 5.min和max 6.minBy和maxBy 7. sum函数 8. find 函数 9. flatten 函数 10flatMap函数 11mapValues 函数 12sorted函数 13sortBy和sortWith 函数 14.partition和span 函数 15grouped 函数和groupBy函数 1.for...

Fresh_man888的博客 1623

基于哈夫曼编码的图像加密算法matlab仿真

哈夫曼编码是一种常用的无损数据压缩算法,其基本思想是根据字符出现的频率构造一棵哈夫曼树,将出现频率高的字符编码为短码,出现频率低的字符编码为长码,从而实现数据的压缩。在图像加密领域,哈夫曼编码也被广泛应用于图像加密算法中,基于哈夫曼编码的图像加密算法具有加密速度快、加密强度高等优点。基于哈夫曼编码的图像加密算法的基本思路是将待加密的图像分为多个小块,对每个小块进行哈夫曼编码,然后将哈夫曼编码后的结果进行异或运算,最后将异或运算后的结果重新编码,以实现图像加密。具体步骤如下:将待加密的图像分成多个小块。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 262

scala 数组函数大全(143个1个不漏,全面案例详解)

scala系列 scala 143个数组函数大全 scala 数组函数大全scala系列前言一、scala 数据简介二、数组函数汇总 前言 本篇博客为大家带来的是 scala 所有(没错,没有看错,就是所有)数组函数的案例详解大全。scala 数组函数是 scala 能够实现代码飘逸的核心基础所在,因此在 scala 入门的时候必须强记下来,没有任何商量的余地。 相信大家在看完的数组函数汇总后,都能够代码敲的飘逸!“so easy” ![在这里插入图片描述](https://img-blog.

BigData_Hubert的博客 8124

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

scala过程懒值与异常处理

scala笔记12-22 过程懒值与异常处理 过程懒值 关键字 lazy,使用时变量前添加关键字 不添加懒值时变量会在类加载的时候进行初始化 添加懒值后,变量会在第一次调用的时候进行初始化 val str1= "123" lazy val str2 = "456" 异常处理 scala同样使用try-catch捕获异常 采用顺序结构来从小到大处理异常,只有一个catch,多个case try { throw new NullPointerException } catch {

m0_49945160的博客 269

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Scala 函数,数组

函数 scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数 定义函数 语法 val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体 函数是一个对象(变量) 类似于方法,函数也有输入参数和返回值 函数定义不需要使用def定义 无需指定返回值类型 参考代码 scala> val add = (x:Int, y:Int) => x + y add: (Int, Int) => Int = &lt.

抓住人生的每一分每一秒,胜过虚度中的每一年每一月!!! 3020

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Scala 数组、集合函数大全(史上最全)

Scala:Array(集合、序列)Array++++:+::+/::\addString(b)addString(b, sep)aggregate Array   数组是一种可变的、可索引的数据集合。在 Scala 中用 Array[T] 的形式来表示 Java 中的数组形式 T[]。 示例: val arr = Array(1, 2, 3, 4) // 声明一个数组对象 val ele = arr(0) // 读取第一个元素 arr(3) = 100 // 替换第四个元素为 100 val _

GodSuzzZ的博客 3438

Scala数组函数

Scala数组函数 1、++ 说明:合并集合,并且返回一个新数组 注:因为数组中包含数字也包含字符串,所以会用Any顶级类型接收,如果数组中有重复内容,不会去重 2、++: 说明:合并集合,冒号右边的类型决定返回结果的类型 3、+: / :+ 向数组前或者后添加一个元素,并且返回新的对象 4、/: :\ 说明:左子树或者右子树,将某个数放置左边,每次和数组中的每个值进行操作,所得到的数值放置左边,然后在和下一个数组中的值操作。右子树一样。 ...

hetry_liang的博客 4279

scala数组集合函数大全

方法名 描述 返回值类型 举例 结果 apply(int i) 按下标取数组数据 同a(i) 数组元素类型 Array(1 ,2,3,4,5).apply(3) res45: Int = 4 ++ 合并数组返回一个新数组,若不同类型以左边为准 左边类型 Array(1 ,2) ++ List(7,8,9) res44: Array[Int] = Array(1, 2, 7, 8, 9) union 合并两个序列,同操作符 ++ 左边类型 Array(1,2) union List(...

sun_0128的博客 1万+

scala 数组函数大全

什么是数组 Scala 语言中提供的数组是用来存储固定大小的同类型元素,跟Java中的数组很类似。 声明数组 //方式一 var arr:Array[String] = new Array[String](1,2,3,4) //方式二 var arr = new Array[String](3) 处理数组 //声明一个数组对象 var arr:Array[String] = new Array[String](1,2,3,4)

xiaolichaoren的博客 1118

scala的函数与定长数组

函数 scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数 定义函数 语法 scala val 函数变量名 = (参数名:参数类型, 参数名:参数类型…) => 函数体 函数是一个对象(变量) 类似于方法,函数也有输入参数和返回值 函数定义不需要使用def定义 无需指定返回值类型 示例 定义一个两个数值相加的函数 调用该函数 参考代码 scala scala&gt...

汉子一枚 1049

Scala 数组、集合函数大全

scala基础函数全集!!一篇足矣

海边微风落 709

Scala数组常用函数(2)

后补齐序列,如果当前序列长度小于 len,那么新产生的序列长度是 len,多出的几个位值填充 elem,如果当前序列大于等于 len ,则返回当前序列。分割序列为两个集合,从第一个元素开始,直到找到第一个不满足条件的元素止,之前的元素放到第一个集合,其它的放到第二个集合。将数组元素是三个元素的这种数组,第一个元素都取出组成一个序列,第二个元素组成一个序列,第三个元素组成一个序列。将数组元素是两个元素的这种数组,把它们的第一个元素取出组成一个序列,第二个元素组成一个序列。

weixin_51981189的博客 3454

scala数组函数

scala数组函数 val a = Array(1,2,3,4) val b = Array(5,6,7,8) def ++ 合并集合,并返回一个新的数组,新数组包含左右两个集合对象内容 val c=a++b def ++: 合并成一个新的数组,右边操纵数的类型决定着返回结果的类型 val c = a++:c def +: 在数组前面添加一个元素,并返回新对象 val c = 1+:a def :+ 在数组末尾添加一个元素,并返回新对象 val c = a:+1 def /:

m0_46480050的博客 363

Scala函数

​//val maxF = max _的意思是将max函数赋值给名为maxF的变量,//但是在这里max后面添加了一个下划线 _,表示将函数的类型转换为函数值的类型​​/*1、两个值找最大值*/​/*2、取绝对值*/// -a中的-表示前缀操作符​/*3、找目标值在数组中的下标位置*/// 也是用递归,循环找数组中的值,index是数组下表// 调用loop时,将index设为0,1、从第一个数查,如果相等返回当前下标。

2301_79020421的博客 1353

scala数组、集合函数大全--最全的实例解析

scala数组、集合函数大全

我玩的很开心的博客 4500
上一篇: redis安装,设置后台启动与简单客户端应用
下一篇: scala基础内容 学习scala的原因,scala的特点,scala和java以及jvm的关系,如何快速的学习并掌握scala
默默谦行
博客等级 码龄7年 5粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值