6. 基本函数
函数的形式如下所示:
def functionName ([list of parameters]) : [return type] = { function body return [expr] }
在 Scala 命令行中,输入如下代码:
def add(a: Int): Int = { return a + 1 } var res = add(1) println(res)
代码解释:定义了一个add函数,返回类型为Int,参数a的类型也是Int,返回结果为参数+1,然后调用add函数,结果赋予res。简而言之,这就是一个加1的函数。
简洁写法:
如果函数不带参数,调用函数的时候可不写括号;
函数体中的语句如果只有一条表达式,可以省略函数的大括号。
如:
def add(): Int = 1 + 1 var res2 = add println(res2)
7. 局部应用
局部应用(Partial application),也译作“偏应用”或“部分应用”;
def add(a: Int, b: Int) :Int = { return a + b } var add1 = add(1, _:Int) var add2 = add1(2) println(add2)
代码解释:定义了一个加法函数add,将其赋值给add1,即add1为新的函数,此处add(1, _:Int)的 _ 则为局部应用的体现,表示任意的参数,类似于一个通配符。 _ 也可以表示成一个匿名函数,在此不做过多解释,在大数据的代码中用非常多。add1(2),传入了一个参数,自动替换add(1, _:Int)的 _ ,可以简单了解为只是应用了部分的参数。
8. 柯里化函数
柯里化( Currying, 也译作“局部套用”),柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
想象这样一种情景:一个乘法函数,在一个场景需要选择乘数,而另一个场景需要选择被乘数。
你可以直接传入两个参数,也可以填上第一个参数然后局部应用第二个参数。
def add(x: Int)(y: Int) :Int = { return x + y } var add1 = add(1)(2) var add2 = add(2) _ var add3 = add2(3) println(add1) println(add3)
经过这个过程,就可以实现在你的函数上应用一些参数,然后又应用上另外的一些参数了。
其实这里跟局部应用相类似。
又如下面的一种场景,在scala中定义2个整数相乘运算的函数,具体如下:
def multiplie2par(x:Int,y:Int)=x*y
使用柯里化技术可以将上述2个整数的乘法函数改修为接受一个参数的函数,只是该函数返回的是一个以原有第二个参数为参数的函数。
def multiplie1par(x:Int)=(y:Int)=>x*y
代码解释:
multiplie1par(x:Int)为接收一个参数的新等价函数,(y:Int)=>x*y则是新等价函数的返回体,它本身就是一个函数(严格上讲应该是一个匿名函数),参数是除了等价新函数的参数外原函数剩余的参数。其实就是参数 x,然后函数体里面的参数为 y,变换了位置了。
上述使用柯里化技术得到的等价新函数,在 Scala 语言中还可以进一步简化,将第一个等号去掉,将 => 写成等号 =:
def multiplie1par1(x:Int)(y:Int)=x*y
此处与普通函数的区别是这里的两个参数是写成两个括号的,不是一个括号。
9. 可变长度参数
我们可以向方法中传入任意多个同类型的参数。例如要在多个字符串上执行 String 的 Capitalize 函数:
// 把所有单词改为首字母大写 def capitalizeAll(args: String*) = { args.map { arg => arg.capitalize } } var str = capitalizeAll("shao", "nai", "yi") println(str)
10. 类
class Calculator { val name: String = "shaonaiyi" def add(m: Int, n: Int): Int = m + n } val calc = new Calculator println(calc.name) println(calc.add(1, 1))
代码解释:定义了一个 Calculator
类,在类中用 def
定义方法和用val
定义字段值。
11. 构造函数
构造函数不是特殊的方法,他们是除了类的方法定义之外的代码。增加一个构造函数参数,并用它来初始化内部状态。
// 这是一个构造函数 class Calculator(name: String) { val color: String = if (name == "shaonaiyi") { "red" } else if (name == "shaonaier") { "green" } else { "blue" } // 实例方法 def add(m: Int, n: Int): Int = m + n }
// 使用构造函数来构造一个实例 val calc = new Calculator("shaonaier") calc.color
Scala 是高度面向表达式的:大多数东西都是表达式而非指令。我们将颜色的值就是绑定在一个if/else
表达式上的。