scala是面向对象的语言,同时也是函数式编程语言。函数在scala中是一等公民,它和变量一样,既可以作为其他函数的参数,也可以将函数赋值给一个变量。
在scala中定义函数有很多方式,不熟悉scala的同学初看之时难免被搞得晕头转向。这里,我试图按照函数是否有返回值来总结一下函数定义的规律,仅供参考。
一、有返回值的函数定义:
1、标准形式(就是函数形参,返回类型,return语句全有)
def addInt(a:Int, b:Int):Int = {
var total:Int = a + b
return total
}
括号里是形参,冒号后面是返回类型,大括号里是函数体。
注意,有返回值的函数定义在大括号前必须有等号,不能省略。
2、省略返回类型和return
当有返回值的时候,可以不显式写出返回类型,scala会自动判断。同时return也可以省略。上面的函数可以简写成:
def addInt(a:Int, b:Int) = {
a + b
}
scala自动返回函数体中最后一个表达式的值并判断类型。这里再多说一句,在java中例如x=1这样的表达式返回的是1,而在scala中赋值语句返回的是空值。所以,如果你想返回值,不要以赋值语句作为最后一条语句。
3、省略大括号
当函数体只有一行语句的时候,可以省略大括号。上面的函数可以再简写成:
def addInt(x:Int, y:Int) = a + b
怎么样,是不是比java简洁很多。
上面3种情况是有返回值的,下面说说无返回值的,更简单。
二、无返回值的函数定义
1、显式标识无返回值
def retrunNone(a:Int,b:Int):Unit = {
print(a + b)
}
Unit关键字表示函数无返回值。
2、省略Unit
和有返回值类似,这里也可以省略Unit,让scala自己去知道这个函数无返回值。那么它是怎么知道的呢?就是省略等号。当函数定义没有等号的时候,scala认为这个函数无返回值。
def retrunNone(a:Int,b:Int){
print(a + b)
}
最后,我们说说也是经常会看到的一种函数定义——匿名函数。
匿名函数顾名思义,就是没有名字的函数。它可以作为函数的参数,也可以直接赋值给变量。
val addInt = (x:Int,y:Int)=> x + y //将一个函数赋值给变量,调用的时候addInt(1,2)
def myFun(f : (Int,Int) => Int, x:Int, y:Int) = f(x,y)
上面这个函数定义了一个匿名函数作为函数的参数,这个匿名函数有两个Int的参数,返回类型是Int。
调用的时候我们可以将任何满足匿名函数条件的函数传入,比如addInt。
那么就是myFun(addInt, 1, 2),返回的是3。
好了,函数定义就先说这么多,欢迎关注后续文章。