scala之函数式编程

1、面相对象编程和函数式编程

2、函数和方法的区别

     scala可以在任何的语法结构中声明任何的语法;

     scala中函数可以嵌套定义;

     scala中如果main内部的函数 和 main外部的函数名称、参数、返回值均一样时,

     此时main内部的函数优先被调用;

3、函数的参数

 (1 ) 可变参数:当前参数的个数可以不确定;

  (2) 如果参数列表中存在多个参数,那么可变参数一般放置在最后;

 (3) 参数默认值,一般将有默认值的参数放在参数列表的后面;

      被指定默认值的参数在调用函数时可以不传该参数;

  (4) 带名参数;

 4、函数至简原则(能省则省)

  (1)  return可以省略,scala会使用函数体的最后一行代码作为返回值;

  (2) 如果函数体只有一行代码,花括号可以省略;

  (3) 返回值类型如果能够推断出来,那么:和 返回值类型 可以一起省略;  

      例如:def function3(name: String) = name

  (4) 如果有return,则返回值类型不能省略,必须指定;

  (5) 如果函数明确声明Unit,那么函数体中即使使用return关键字,也不起作用;

  (6) scala中如果期望是无返回值类型,可以省略等号;     

  (7) 如果函数无参,但是声明了参数列表,那么调用时,小括号可加可不加;   

  (8) 如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略;   

  (9) 如果不关心当前函数的名称,只关心逻辑处理,那么函数名(def)可以省略;

      注意:def省略后的函数被成为 匿名函数,lambda表达式 

5、匿名函数

  (1 ) 匿名函数的调用: 将整个函数的值赋给变量;

  (2) 匿名函数的简化原则

  a、参数的类型可以省略,会根据形参进行自动的推导;

  b、类型省略之后,发现只有一个参数,则圆括号可以省略;

      其他情况:没有参数或参数超过1的永远不能省略圆括号;

  c、如果匿名函数的函数体只有一行,则大括号也可以省略;

  d、如果参数只出现一次,则参数省略且后面参数可以用_替代;

  e、如果可以推断出,当前传入的println是一个函数体,而不是调用语句,可以直接省略下划线;

  (3) 匿名函数的应用

  a、应用1:以函数作为参数输入:此时的函数可以称为是一种操作;

      println(dualEval( _ + _ , 23 , 44 ))      //可以再进一步进行简化

  b、应用2:函数可以作为值传递

  c、应用3:函数可以作为函数返回值返回

6、scala递归实现阶乘

缺点:耗费很多栈空间资源,可能会出现栈内存溢出。

      // 计算f5的数据时,f(5)/f(4)/f(3)...f(1)的数据均存储在栈针中。

 7、控制抽象--针对函数参数

     值调用:传值参数

    名调用:传名参数

8、闭包和柯里化

(1)、闭包:如果一个函数访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,成为闭包。

         闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值

      目的:把内层函数所依赖的变量给保存起来,延长变量的生命周期,保证我们调用时能找到。

  实现方式:外层函数 要以内层函数作为返回值 来返回

                 (以一个内层函数作为返回值,来定义一个外层函数:内层函数用到了外层函数的变量/参数)

      闭包实例

(2)、函数柯里化:把一个参数列表的多个参数,变成多个参数列表(更常用)。

       注意:柯里化的底层一定是闭包;闭包并非要用柯里化去书写

小扩展:

JVM中: 所有使用的对象 是存储在heap堆(堆本身线程是共享的)中,

          所有的局部变量和操作数 存在stack栈(栈本身线程是独享的)中

posted @ 2022-07-27 17:17  一直在寻找的路上  阅读(234)  评论(0编辑  收藏  举报