Scala-part2
>函数<
- 在scala中,函数是可重用的命名表达式。
- 尽可能构建纯函数,类似数学意义上的函数。
- 无输出函数:
1 | // 无输出函数 |
过程:没有返回值的函数,当一个函数没有显式的返回类型,而且最后是一个语句,scala推导这个喊你数的返回类型是Unit,表示没有值。
1 | scala> def log(d: Double): Unit = println(f"Got value $d%.2f") |
空括号定义的函数
scala约定当函数会修改其范围外的数据时,定义时就应该加空括号。
1 | scala> def hi(): String = "hi" |
块表达式调用函数
中间不会保存为局部值,提高效率。
递归函数
@annotation.tailrec
标识判断递归函数必须为尾递归(tail-recursion),尾递归使得递归调用不使用额外的栈空间,而是使用当前的栈空间。
尾递归的最后语句是该递归函数本身。
1 | scala> .tailrec |
nested函数
即使内部函数与外部函数同名且参数数目相同,內部函数优先级高于外部。
1 | scala> def max(a: Int, b: Int, c: Int) = { |
vararg参数
参数类型+*
即代表可以传入多个同类型参数。
1 | scala> def sum(item: Int*): Int = { |
类型参数
类型匹配规则:函数名的后面紧跟[type]
表示。
1 | scala> def identity[A](a: A): A = a |
首类函数
- 首类函数(first-class):函数不仅能得到声明和调用,还可以作为一个数据类型用在这个语言的任何地方。
- 高阶函数(higher-order):接受其他函数作为参数,或使用函数作为返回值,如map/reduce。
- 声明式编程(Declarative Programming):要求使用高阶函数或其他机制声明要做的工作,而不手动实现。
- 命令式编程(Imperative Programming):you know that bro~
1 | scala> def double(x: Int): Int = x * 2 |
多个参数传递用()
:
1 | scala> def max(a: Int, b: Int) = if (a > b) a else b |
高阶函数
1 | scala> def safeStringOp(s: String, f: String => String) = { |
函数字面量(lambda函数)
1 |
|
占位符语法
- 使用情况:
- 函数的显式类型在字面量之外指定;
- 参数最多只使用一次;
- 多个
_
按位置替换输入参数:
1 | scala> def combination(x: Int, y: Int, f: (Int, Int) => Int) = f(x, y) |
- 输入与输出类型都进行参数化:
1 | //A:输入类型;B:输出类型 |
函数部分利用、函数柯里化
1 |
|
1 | //多个参数表的函数视为--->多个函数的一个链 |
传名参数
形式: <identifier>: => <type>
- 若传递函数值,每次在函数內使用传递的参数时都会调用该函数。
1 |
|
偏函数
感觉像是强制匹配函数,只能部分应用于输入数据的函数,比如除法函数不能除以0就是偏函数。
- 偏函数:一系列
case
模式,输入数据必须匹配至少一个
1 | scala> val statusHanndler: Int => String = { |
调用字面量
1 | //1.穿值参数,第二个参数是一个函数,表示用表达式块语法调用 |