文章目录
Scala函数
函数的类型和值
函数字面量:literal
函数字面量可以体现函数是编程的核心理念,在函数式编程中,函数是“头等公民”,可以向其他数据类型一样被传递和操作,也就是说,函数的使用方式和其他数据类型的使用方式完全一致。
这是,我们就可以像定义变量那样去定义一个函数,由此导致的结果是,函数也会和其他变量一样,可以有“值”。就像变量的“类型”和“值”是分开的两个概念一样,函数式编程中,函数的“类型”和“值”也成为了两个分开的概念,函数的“值”,就是“函数字面量”
def counter(value: Int): Int = {
value+=1}
函数的类型:
(Int) => Int //若输入值只有一个,则可省略括号
函数的值
(value) => {
value+=1} //只有一条语句时,大括号可以省略
按照上面类似的形式来定义Scala中的函数
无法执行,value不可被赋值。参考匿名函数。
val counter: Int => Int = {
(value) => value += 1}
占位符语法
为了让函数字面量更加简洁,我们可以使用下划线作为一个或多个参数的占位符,只要每个参数在函数字面量内仅出现一次。
x => x > 0 与 _ > 0等价
可以通过冒号指定占位符的类型
val f = (_: Int) + (_: Int)
Scala函数传名调用
scala的解释器在解析函数参数时有两种方式:
- 传值调用:先计算参数表达式的值,在应用到函数内部
- 传名调用:将为计算的参数表达式直接应用到函数内部,每次使用传名调用时,解释器都会计算一次表达式的值。
object Test {
def main(args: Array[String]) {
delayed(time());
}
def time() = {
println("获取时间,单位为纳秒")
System.nanoTime
}
def delayed( t: => Long ) = {
println("在 delayed 方法内")
println("参数: " + t)
}
}
def deplayed(t: => Long) 改为 def deplayed(t: Long)
1.2 Scala指定函数参数名
一般情况下函数调用参数,就按照函数定义时的参数顺序一个个传递。但是我们可以通过指定函数参数名,并且不需要按照顺序向函数传递参数。
1.3 Scala函数-可变参数
Scala允许知名函数的最后一个参数时可以重复的,即我们不需要指定函数参数的个数,可以向函数传入可变长度参数列表。
Scala通过在参数的类型之后放一个星号来设置可变参数。
object Test {
def main(args: Array[String]) {
printStrings("Runoob", "Scala", "Python");
}
def printStrings( args:String* ) = {
var i : Int = 0;
for( arg <- args ){
println("Arg value[" + i + "] = " + arg )