logo头像
Snippet 博客主题

Scala-函数

Scala支持函数式编程范式


默认参数

Scala的函数像Python一样可以给参数赋默认值,但并不需要放在最后

1
2
3
4
5
def decorate(s: String, left: String = "[", right: String = "]") = {
s"${left} ${s} ${right}"
}

println(decorate("haha"))

带名参数

调用函数时指定参数名会提高代码的可读性

1
2
3
4
5
def decorate(s: String, left: String = "[", right: String) = {
s"${left} ${s} ${right}"
}

println(decorate("haha", right = "]"))

变长参数

对于Seq类型的对象,可以通过:_*将其转为参数序列

1
2
3
4
5
6
7
8
9
def sum(args: Int*) = {
var ret = 0
for (arg <- args)
ret += arg
ret
}

println(sum(1, 2, 3, 4, 5))
println(sum(Array(1, 2, 3):_*))

过程

不同于函数,如果不在定义时使用=就是一个过程(procedure),这时其实是为了它的“副作用”

1
2
3
4
5
def hello(): Unit = {
println("hello world")
}

hello()

偏函数

被包在花括号内的一组case语句是一个偏函数,一个并非对所有输入值都有定义的函数。它是PartialFunctionA, B类的一个实例。该类有两个方法,apply方法从匹配到的模式计算函数值,而isDefinedAt方法在输入至少匹配其中一个模式时返回true.

1
2
3
4
5
6
7
"-2+2".collect {
case '+' => 1
case '-' => -1
// case _ => 0 没有匹配所有的字符
}

结果: Vector(-1, 1)

匿名函数

Scala中的匿名函数定义非常简单,=> 左边是参数列表,右边是函数体即可

1
2
3
4
5
6
7
8
9
10
val multiply3 = (a: Int) => a * 3
println(multiply3(2))
结果: 6

val multiply3 = (a: Int) => {
val b = a + 1
b * 3
}
println(multiply3(2))
结果: 9

应用于map等函数中

1
Array(1, 2, 3).map(x => x * 3)

评论系统未开启,无法评论!