小记--------scala---函数式编程
将函数赋值给变量
语法: 函数名 _
scala中的函数可以独立定义,独立存在,而且可以直接将函数作为赋值给变量
匿名函数
scala中,函数也可以不需要命名,此时函数被称为匿名函数
可以直接定义函数之后,将函数赋值给某个变量;也可以将直接定义的匿名函数传入其他函数之中。
scala定义匿名函数的语法:
(参数名:参数类型) => 函数体
高阶函数
scala中,可以直接将某个函数传入其他函数,作为参数。
接收其他函数作为参数的函数,也被称作高阶函数(higher-order-function)
函数作为参数:例
函数作为返回值
高级函数的类型推断
高阶函数可以自动推断参数类型,而不需要写明类型;
而且对于只有一个参数的函数,还可以省去其小括号;
如果仅有的一个参数在右侧的函数体内只使用一次,则还可以将接收参数省略,并且将参数用 _ 来替代
下面的例子:传入一个函数的 传入参数是Int, 返回值是Int, 本函数没有传入参数, 返回值是Int
scala的常用高阶函数
map:对传入的每个元素都进行映射,返回一个处理后的元素
foreach:对传入的每个元素都进行处理,但是没有返回值
filter:对传入的每个元素都进行条件判断,如果对元素返回true,则保留该元素,否则过滤掉该元素
reduceLeft:从左侧元素开始,进行reduce操作,即先对元素1和元素2进行处理,然后将结果与元素3处理,再将结果与元素4处理,。。。 即为reduce
sortWith:对元素进行两两相比,进行排序
闭包
函数在变量不处于其有效作用域时,还能够对变量进行访问,即为闭包
scala通过为每个函数创建对象来实现闭包,实际上对于g函数创建的函数,msg参数是作为函数对象的变量存在的,每个函数可以用于不同的msg
scala编译器会确保上述闭包机制
SAM转换
在java中,不支持直接将函数传入一个方法作为参数,唯一的办法就是定义一个实现了某个接口的类的实例对象,该对象只有一个方法;而这些接口都只有单个的抽象方法,也就是single abstract method 。简称为SAM
由于scala是可以调用java的代码,因此当我们调用java的某个方法时,可能就不得不创建SAM传递给方法,非常麻烦;但是scala又是支持直接传递函数的,此时就可以使用scala提供的,在调用java方法时,使用的功能,SAM转换,即将SAM转换为scala函数
要使用SAM转换,需要使用scala提供的特性,隐式转换
Currying函数
将原来接收两个参数的一个函数,转换为两个函数,第一个函数接收原先的第一个参数,然后返回接收原先第二个参数的第二个函数。
在函数调用的过程中,就变为了两个函数连续调用的形式
接收两个参数的函数
拆分为两个函数: sum1就是currying函数
return
scala中,不需要使用return来返回函数的值,函数最后一行语句的值,就是函数的返回值,在scala中,return用于内部函数中返回值给包含内部函数的带名函数,并作为带名函数的返回值
使用return的匿名函数,是必须给出返回类型的,否则无法通过编译
作者:于二黑
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。