小记--------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的匿名函数,是必须给出返回类型的,否则无法通过编译
 
 
posted @ 2020-04-11 22:57  二黑诶  阅读(174)  评论(0编辑  收藏  举报