1 偏函数
1)在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择
2)将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数实施计算,超出范围的值会忽略(未必会忽略,这取决于你打算怎样处理)
3)偏函数在Scala中是一个特质PartialFunction
基本介绍
1)在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择
2)将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数实施计算,超出范围的值会忽略(未必会忽略,这取决于你打算怎样处理)
3)偏函数在Scala中是一个特质PartialFunction
偏函数快速入门
val list = List(1, 2, 3, 4, "abc") //说明 val addOne3= new PartialFunction[Any, Int] { def isDefinedAt(any: Any) = if (any.isInstanceOf[Int]) true else false def apply(any: Any) = any.asInstanceOf[Int] + 1 } val list3 = list.collect(addOne3) println("list3=" + list3) //?
偏函数的小结
1)使用构建特质的实现类(使用的方式是PartialFunction的匿名子类)
2)PartialFunction 是个特质(看源码)
3)构建偏函数时,参数形式 [Any, Int]是泛型,第一个表示参数类型,第二个表示返回参数
4)当使用偏函数时,会遍历集合的所有元素,编译器执行流程时先执行isDefinedAt()如果为true ,就会执行 apply, 构建一个新的Int 对象返回
5)执行isDefinedAt() 为false 就过滤掉这个元素,即不构建新的Int对象
6)map函数不支持偏函数,因为map底层的机制就是所有循环遍历,无法过滤处理原来集合的元素
7)collect函数支持偏函数
偏函数简化形式
声明偏函数,需要重写特质中的方法,有的时候会略显麻烦,而Scala其实提供了简单的方法
1)简化形式1
2)简化形式2
2 作为参数的函数
函数作为一个变量传入到了另一个函数中,那么该作为参数的函数的类型是:function1,即:(参数类型) => 返回类型
//说明 def plus(x: Int) = 3 + x //说明 val result1 = Array(1, 2, 3, 4).map(plus(_)) println(result1.mkString(","))
应用实例小结
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 一个函数
3 匿名函数
没有名字的函数就是匿名函数,可以通过函数表达式来设置匿名函数
val triple = (x: Double) => 3 * x println(triple(3))
1)(x: Double) => 3 * x 就是匿名函数
2)(x: Double) 是形参列表, => 是规定语法表示后面是函数体, 3 * x 就是函数体,如果有多行,可以 {} 换行写.
3)triple 是指向匿名函数的变量。
4 高阶函数
能够接受函数作为参数的函数,叫做高阶函数 (higher-order function)。可使应用程序更加健壮。
高阶函数基本使用
//test 就是一个高阶函数,它可以接收f: Double => Double def test(f: Double => Double, n1: Double) = { f(n1) } //sum 是接收一个Double,返回一个Double def sum(d: Double): Double = { d + d } val res = test(sum, 6.0) println("res=" + res)
高阶函数可以返回函数类型
def minusxy(x: Int) = { (y: Int) => x – y //匿名函数 } val result3 = minusxy(3)(5) println(result3)
高级函数案例的小结
说明: def minusxy(x: Int) = (y: Int) => x - y
1)函数名为 minusxy
2) 该函数返回一个匿名函数
(y: Int) = > x -y
说明val result3 = minusxy(3)(5)
1) minusxy(3)执行minusxy(x: Int)得到 (y: Int) => 3 - y 这个匿名函
2) minusxy(3)(5)执行 (y: Int) => x - y 这个匿名函数
3) 也可以分步执行: val f1 = minusxy(3); val res = f1(90)