Scala 函数式高级编程

偏函数(partial function)⭐⭐⭐⭐

小题目引出偏函数:
给你一个集合val list = List(1, 2, 3, 4, “abc”) ,请完成如下要求:
将集合list中的所有数字+1,并返回一个新的集合
要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)

方法一:filter 过滤, map 转换, map + 1
在这里插入图片描述
可以解决,稍显麻烦

方法二:模式匹配

在这里插入图片描述
输出结果略有瑕疵

方法三:偏函数
基本介绍
1)在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择
2)将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的 参数实施计算,超出范围的值会忽略(未必会忽略,这取决于你打算怎样处理)
3)偏函数在Scala中是一个特质PartialFunction

在这里插入图片描述

小结:

1)使用构建特质的实现类(使用的方式是PartialFunction的匿名子类)
2) PartialFunction 是个特质(看源码)
3) 构建偏函数时,参数形式 [Any, Int]是泛型,第一个表示参数类型,第二个表示返回参数
4)当使用偏函数时,会遍历集合的所有元素,编译器执行流程时先执行isDefinedAt()如果为true ,就会执行 apply, 构建一个新的Int 对象返回
5)执行isDefinedAt() 为false 就过滤掉这个元素,即不构建新的Int对象.
6)map函数不支持偏函数,因为map底层的机制就是所有循环遍历,无法过滤处理原来集合的元素
7)collect函数支持偏函数

偏函数的简写
上面声明偏函数时需重写特质中的方法,有时略显麻烦,Scala 提供了更简单的方法
1)简化形式1
在这里插入图片描述
代码:

    def pF: PartialFunction[Any, Int] ={
      case i: Int => i +1
    }

2)简化形式2
在这里插入图片描述

作为参数的函数⭐⭐

在这里插入图片描述

小结:

1)map(plus()) 中的plus() 就是将plus这个函数当做一个参数传给了map,_这里代表从集合中遍历出来的一个元素。

2)plus(_) 这里也可以写成 plus 表示对 Array(1,2,3,4) 遍历,将每次遍历的元素传给plus的 x
3)进行 3 + x 运算后,返回新的Int ,并加入到新的集合 result1中
4)def map[B, That] (f: A => B) 的声明中的 f: A => B 一个函数

匿名函数⭐⭐

没有函数的函数就是匿名函数,即只有方法体。
可以通过函数表达式来设置匿名函数
匿名函数的返回值是通过类型推导实现的

在这里插入图片描述

高阶函数⭐⭐⭐⭐

能够接受函数作为参数的函数,叫做高阶函数 (higher-order function)。可使应用程序更加健壮。
在这里插入图片描述
高阶函数中可以接受多个函数,函数之间也可以调用
在这里插入图片描述

高阶函数可以返回函数类型
下面的miuns(4)(9)
先将4赋值给x,再将9赋值给y
在这里插入图片描述

类型(参数)推断⭐⭐⭐

参数推断省去类型信息,
在某些情况下,参数类型是可以推断出来的。同时也可以进行相应的简写

参数类型推断写法说明

1)参数类型是可以推断时,可以省略参数类型
2)当传入的函数,只有单个参数时,可以省去括号
3)如果变量只在=>右边只出现一次,可以用_来代替

案例一:
在这里插入图片描述
案例二:
在这里插入图片描述

闭包 closure⭐⭐⭐⭐

闭包就是一个函数和与其相关的引用环境组合的一个整体

将函数视为方法,相关的引用环境视为属性

在使用闭包时,主要搞清楚返回函数引用了函数外的哪些变量,因为他们会组合成一个整体(实体),形成一个闭包

案例:
请编写一个程序,具体要求如下
1)编写一个函数 makeSuffix(suffix: String) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包
2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
3)要求使用闭包的方式完成
提示:String.endsWith(xx)
在这里插入图片描述
闭包的好处

返回的匿名函数和 makeSuffix (suffix string) 的 suffix 变量 组合成一个闭包,因为 返回的函数引用到suffix这个变量
我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,
但是传统方法需要每次都传入 后缀名,比如 .jpg ,或使用全局变量
而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用

函数柯里化⭐⭐⭐⭐

基本介绍

1)函数编程中**,接受多个参数的函数都可以转化为接受单个参数的函数**,这个转化过程就叫柯里化

2)柯里化就是证明了函数只需要一个参数而已。

3)不用设立柯里化存在的意义这样的命题。柯里化就是以函数为主体这种思想发展的必然产生的结果。(即:柯里化是面向函数思想的必然产生结果)

在这里插入图片描述

案例:
在这里插入图片描述
代码:
在这里插入图片描述

抽象控制⭐⭐⭐⭐⭐

抽象控制是函数,满足下列条件
1)参数是函数
2)函数参数没有输入值也没有返回值
案例一:
在这里插入图片描述

案例二:
通过控制抽象写出类似 while 循环的效果
普通while 循环:
在这里插入图片描述
控制抽象:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45468845/article/details/106326480