scala复习
2024-06-23 21:10:27 5 举报
AI智能生成
Scala是一种多范式的编程语言,专门用于编写并发和分布式应用程序。它结合了面向对象和函数式编程的特性,使其成为开发高质量、高效软件的理想选择。
作者其他创作
大纲/内容
数据类型
Int
Float
Double
String
Boolean
Unit
定义常量变量
定义常量
val name:type = initialization
定义变量
var name:type = initialization
运算符
算数运算符
关系运算符
逻辑运算符
&&
与:都为真才为真
||
或:有一个为真就可以为真
!
对结果取反:比如!=为不等于
位运算符
&
按二进制运算,两位同时结果为1才为1
|
按二进制运算,两位有一个结果为1就为1
^
按二进制运算,两位不同结果为1,相同结构为0
赋值运算符
=
将右侧的值赋于左侧
+=
执行加法后再赋值左侧
-=
*=
/=
%=
执行取余后再赋值左侧
<<=
左移位后赋值左侧
>>=
右移位后再赋值左侧
&=
按位&运算后赋值左侧
|=
按位|运算后赋值左侧
^=
按位^运算后赋值左侧
数组的定义和使用
定义
var arr:Array[String]=new Array[String](num)
var arr:Array[String]=Array(元素1,元素2,……)
使用方法
length
head
tail
查看数组除第一个以外的其他元素
isEmpty
判断数组是否为空
contains(x)
判断数组是否包含x
函数
定义
def functionName(参数列表):[return type] = {}
使用
functionName(参数列表)
匿名函数
定义:无函数名词,直接使用=>定义,左边是参数列表,右边是表达式。
调用:通过赋值给常量/变量,使用常量/变量调用函数。
若函数中每个参数只出现一次可以使用占位符_代替
高阶函数
函数作为参数
➢高阶函数指的是操作其他函数的函数。
➢高阶函数可以将函数作为参数,也可以将函数作为返回值。
➢高阶函数经常将只需要执行一次的函数定义为匿名函数并作为参数。一般情况下,匿名函数的定义是“参数列表=>表达式”。
➢由于匿名参数具有参数推断的特性,即推断参数的数据类型,或根据表达式的计算结果推断返回结果的数据类型,因此定义高阶函数并使用匿名函数作为参数时,可以简化匿名函数的写法。
函数作为返回值
➢高阶函数可以产生新的函数,并将新的函数作为返回值。
➢定义高阶函数计算矩形的周长,该函数传入一个Double类型的值作为参数,返回以一个Double类型的值作为参数的函数。
函数柯里化
➢函数柯里化是指将接收多个参数的函数变换成接收单一参数(最初函数的第一个参数)的函数,新的函数返回一个以原函数余下的参数为参数的函数。
使用
定义两个整数相加的函数
写法:def addInt(a:Int,b:Int):Int=a+b
调用:addInt(1,2)
柯里化
def addInt(a:Int)(b:Int):Int=a+b
调用:addInt(2)(3)
流程控制语句
if
if语句
if(布尔表达式) { 若布尔表达式为true,则执行该语句块}
if...else语句
if(布尔表达式) { 若布尔表达式为true,则执行该语句块}else { 若布尔表达式为false,则执行该语句块}
if...else if...else语句
if...else嵌套语句
循环
for
for(变量<-集合){循环语句}
嵌套循环
使用yield将返回值作为一个变量存储
var retVar = for(var x <- List;if condition1;if condition2……)yield x
➢retVar是变量名
➢for关键字后的括号用于指明变量和条件
➢yield将每一次循环返回值保存在一个集合中,循环结束后将返回该集合,并赋值给变量retVar
使用yield对1~10的偶数进行记录,并保存至变量even中。
var even=for(i<-1 to 10;if %2==0)yield i
while
do……while
读写数据
Scala没有写入方法,只能使用java的I/O类的PrintWriter来实现
读取键盘输入的命令
先导入:import scala.io.Stdin
读取并赋值给line:var line = Stdin.readLine
读取文件内容(source类)
列表
与数组相似但是元素不可变,所有元素类型相同,定义是需要写出数据类型,例如List[String]
定义列表的基本单位
Nil表示空列表
“::”中级操作符,表示从前端扩展,遵循右结合
常用操作方法
def head:A获取列表第一个元素
def init:List[A]返回除最后一个元素的所有元素
def last:A获取最后一个元素
def tail:List[A]返回所有元素,除了第一个元素
def :::(prefix:List[A]):List[A]在列表开头添加指定列表的元素
def take(n:Int):List[A]获取列表前n个元素
def contains(elem:Any):Boolean判断列表是否包含指定元素
常用查看方法
head查看列表第一个元素
tail查看除第一个元素的其余元素
last查看列表最后一个元素
Init查看除最后一个元素的其余元素
take()查看列表前n个元素
列表合并
":::"用法
需要注意,“列表1:::列表2”与“列表1.:::(列表2)”的结果是不一样的,对于前者,列表2的元素添加在列表1的后面;对于后者,列表2的元素添加在列表1的前面
concat方法
val mergedList = list1.concat(list2)
集合
Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的
常用操作方法
def head:A获取集合第一个元素
def init:Set[A]返回除最后一个元素的其余元素
def last:A获取最后一个元素
def tail:Set[A]返回除第一个元素的所有元素
def ++(elem:A):Set[A]合并两个集合
def take(n:Int):Set[A]获取集合前n个元素
def contains(elem:Any):Boolean判断集合中包含指定元素
集合合并
列表是:::和concat,集合是++方法,set1++set2
映射
➢映射(Map)是一种可迭代的键值对结构
➢所有的值都可以通过键来获取,并且映射中的键都是唯一的
➢集合操作常用方法同样也适合映射
➢另外映射还可以通过keys方法获取所有的键
➢通过values方法获取所有值
➢也可以通过isEmpty方法判断映射的数据是否为空
元组
类似于列表但不同的是可以包含不同类型的元素
元组的值通过将单个值包含在圆括号中构成
scala的元组最大长度对多只能包含22个元素
元组索引:元组名词._元组索引,索引从1开始
函数组合器
遍历:map方法
列表num:num.map(x=>x*x),会返回一个新列表
循环遍历:foreach方法
与map相似,但不同的是,他不反悔列表,直接返回输出一串结果参数
筛除:filter方法
num.filter(x=>x%2==0)筛选num列表中能整除2的元素
展开嵌套列表:flatten方法
list(list(1,2,3),list(4,5,6)) => list.flatten => list(1,2,3,4,5,6)
flatMap方法
结合map和flatten方法,常与匿名函数连用,匿名函数处理嵌套列表的每个子列表,最后展开为一个列表
num: list(list(1,2,3),list(4,5,6)) =>num.flatMap(x=>x.map(_*2)) => 首先x为每个子列表(遍历),然后对每个子列表使用map遍历,对每个子列表的每个元素乘以2(”_“在匿名函数中为占位符),最后将处理后的小列表展开为一个大列表。
分组:groupBy方法
对集合中的元素分组,最后返回一个映射
num: list(1到10) => num.groupBy(x=>x%2==0) 结果为: false ->List(1,3,4,5,7,9), true -> List(2,4,6,8,10)
类
定义格式为class ClassName(参数列表) extendst {}
可以有多个类,scala类也可以有参数
一般类名第一个字母大写,如果是多个单词,则每个单词首字母大写
与java不同的是scala类不定义为public
继承一个类时需要使用extends
只允许继承一个父类并且继承父类的所有属性和方法
子类继承父类中已经实现的方法时,需要使用override关键字,子类继承父类中未实现的方法时,可以不用override关键字
单例模式
➢语法:object ObjectName{}
➢Scala中没有static关键字,因此Scala的类中不存在静态成员。但是Scala可以使用object关键字实现单例模式
➢Scala中使用单例模式时需要使用object定义一个单例对象(object对象),单例对象在整个程序中只有一个实例
➢单例对象与类的区别在于单例对象不能带参数
➢包含main方法的object对象可以作为程序的入口点
➢当单例对象与某个类共享同一个名称时,单例对象被称作这个类的伴生对象,类被称为这个单例对象的伴生类。类和它的伴生对象可以互相访问对方的私有成员
➢需要注意的是,必须在同一个源文件里定义类和它的伴生对象
模式匹配
➢Scala提供了强大的模式匹配机制。一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。模式和表达式之间用“=>”隔开
➢在Scala中,使用case关键字定义的类称为样例类。样例类是一种特殊的类,经过优化可应用于模式匹配
➢Scala编译器为样例类添加了一些语法上的便捷设定
•在伴生对象中提供了apply()方法,因此不使用new关键字也可以构造对象
•样例类参数列表中的所有参数已隐式获得val关键字
•编译器为样例类添加了toString()、hashCode()和equals()等方法
0 条评论
下一页
为你推荐
查看更多