scala学习(2)

1.程序的流程控制
-顺序流程
-分支流程(选择流程)
*单分支
if(条件表达式){
语句块
}

*双分支
if(条件表达式){
语句块1
}else{
语句块2
}

*多分支
if(条件表达式1){
语句块1
}else if(条件表达式2){
语句块2
}....else if可以有多个
else{
语句块3
}
*在scala语言中,分支是有返回值的,返回值是满足条件的分支块最后一行的执行结果;如果每一个分支块
返回的数据类型不一致,那么就用它们共同的祖先类型作为返回值类型


-循环流程
*for
>语法
for(变量名:数据类型 <- 数组|集合){

}
数据类型可以省略,因为可以通过集合中的元素推断出来

>范围数据循环 to | until

>循环守卫
在循环的过程中,加判断条件
通过循环守卫或者在循环体中加if判断,可以实现类似continue效果

>循环步长 by
只针对于Range集合
按照指定的步长对数据进行生成

>循环嵌套
for(外层循环;内层循环){}

>循环引入变量
在循环的时候,定义新的变量,该变量的值受循环变量的影响


*while
>while
>do...while

*循环中断
>在scala语言中,没有break关键字,通过抛出异常,并对异常进行处理的方式,来实现类似break的效果
>Scala提供了Breaks类 break() 和breakable()
>导入每一个类下的"静态"成员

2.函数式编程
-函数的基本语法
def 函数名(参数列表):返回值类型={
函数体
}

函数类型: (参数形式)=>返回值

-函数的参数
*可变长参数
>在一个参数列表中,至多只能有一个可变长参数
>如果一个参数列表中,有多个参数,应该将可变长参数放到最后

*参数默认值
>在声明函数的时候,函数的形参可以赋默认值
>如果参数有默认值,那么在调用函数的时候,有默认值的参数可以不用传参,使用默认值作为参数
>如果参数有默认值,那么在调用函数的时候,也可以传递参数,会用传递的参数替换默认值作为参数

*带名参数
在调用函数的时候,我们可以指定给哪个参数进行赋值

-函数至简原则(能省则省)
*return可以省略,Scala会使用函数体的最后一行代码作为返回值
*如果函数体只有一行代码,可以省略花括号
*返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
*如果有return,则不能省略返回值类型,必须指定
*如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用
*Scala如果期望是无返回值类型,可以省略等号
*如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加
*如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
*如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

-匿名函数
*参数的类型可以省略,会根据形参进行自动的推导
*类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号。
*匿名函数如果只有一行,则大括号也可以省略
*如果参数只出现一次,则参数省略且后面参数可以用_代替

3.高阶函数
-函数更高级的用法
-在Scala语言中,函数是一等公民
*函数可以作为值进行传递
>语法
var f = 函数名 _
>如果明确了变量的数据类型,那么下划线可以省略

*函数可以作为参数进行传递
>通过匿名函数
>扩展函数的功能
>提高函数的灵活度

*函数可以作为返回值进行返回
>函数的嵌套

>函数链式调用,通过参数传递数据,在执行的过程中,函数始终占据栈内存,容易导致内存溢出

>闭包
内层函数访问外层函数的局部变量,会自动延长外层函数局部变量的生命周期,与内层函数形成一个
闭合的效果,我们称之为闭包

>柯里化
&将一个参数列表中的多个参数,拆分为多个参数列表
&好处1:每一个参数列表表示函数清晰明确
&好处2:简化闭包代码的编写

-控制抽象
*值调用
传递的是函数执行后的结果

*名调用
传递的是代码块
=>代码块返回值类型

posted @ 2021-01-13 15:50  恶霸xx  阅读(69)  评论(0编辑  收藏  举报