在
scala
中,方法定义在内中,这点类似于java
,此文说明如何定义方法,及方法一些用法
阅读之前,可以先行浏览一下
官方文档
scala相关文章
这个例子定义了一个名为 double
方法,只有一个 Int
类型入参 ,名称叫 a
,返回类型也是 Int
def double(a: Int) = a * 2
在
Scala
中定义函数需要使用def
关键字,函数包括函数名、参数、函数体
Scala
要求必须给出函数所有参数的类型,但是函数返回值的类型不是必须的,因为Scala
可以自己根据函数体中的表达式推断出返回值类型。
函数中最后一行代码的返回值就是整个函数的返回值,不需要使用return
,这一点与Java
不同,java
中函数的返回值是必须要使用return
的
// 显示的声明函数返回类型
def double(a: Int): Int = a * 2
多参类似于
java
,下面例子中没显性声明返回类型,scala
会自行推断
def add(a: Int, b: Int) = a + b
执行
scala> def add(a: Int, b: Int) = a + b
add: (a: Int, b: Int)Int
scala> add(1,2)
res1: Int = 3
前面的例子中,全是单行函数
def addThenDouble(a: Int, b: Int): Int = {
val sum = a + b
val doubled = sum * 2
doubled
}
scala> def addThenDouble(a: Int, b: Int): Int = {
| val sum = a + b
| val doubled = sum * 2
| doubled
| }
addThenDouble: (a: Int, b: Int)Int
scala> addThenDouble(1,2)
res2: Int = 6
前面在构造函数中说过命名参数(链接)的应用;
在
Scala
中,有时候我们调用某些函数时,不希望给出参数的具体值,而是希望使用参数自身默认的值,此时就需要在定义函数时使用默认参数。
如果给出的参数不够,则会从左往右依次应用参数
def sayHello(fName: String, mName: String = "mid", lName: String = "last") = fName + " " + mName + " " + lName
scala> def sayHello(fName: String, mName: String = "mid", lName: String = "last") = fName + " " + mName + " " + lName
sayHello: (fName: String, mName: String, lName: String)String
scala> sayHello("zhang","san")
res3: String = zhang san last
对比java
中实现默认参数的写法
public void sayHello(String name, int age) {
if(name == null) {
name = "defaultName"
}
if(age == 0) {
age = 18
}
System.out.println("Hello, " + name + ", your age is " + age)
}
在调用函数时,也可以不按照函数定义的参数顺序来传递参数,而是使用带名参数的方式来传递。
scala> sayHello(fName = "Mick", lName = "Tom", mName = "Jack")
res4: String = Mick Jack Tom
在
Scala
中,有时我们需要将函数定义为参数个数可变的形式,则此时可以使用变长参数来定义函数
def sum(nums: Int*) = {
var res = 0
for (num <- nums) res += num
res
}
scala> def sum(nums: Int*) = {
| var res = 0
| for (num <- nums) res += num
| res
| }
sum: (nums: Int*)Int
scala> sum(1,2,3,4,5)
res5: Int = 15
在
Scala
中,定义函数时,如果函数体直接在花括号里面而没有使用=连接,则函数的返回值类型就是Unit
,这样的函数称之为过程
过程通常用于不需要返回值的函数,过程还有一种写法,就是将函数的返回值类型显式定义为Unit
def sayHello(name: String) = "Hello, " + name
def sayHello(name: String): String = "Hello, " + name
def sayHello(name: String) { "Hello, " + name }
def sayHello(name: String): Unit = "Hello, " + name
def sayHello(name: String) = "Hello, " + name
scala> def sayHello(name: String) = "Hello, " + name
sayHello: (name: String)String
scala> sayHello("xx")
res6: String = Hello, xx
def sayHello(name: String): String = "Hello, " + name
scala> def sayHello(name: String): String = "Hello, " + name
sayHello: (name: String)String
scala> sayHello("xx")
res7: String = Hello, xx
def sayHello(name: String) { "Hello, " + name }
def sayHello(name: String): Unit = "Hello, " + name
scala> def sayHello(name: String): Unit = "Hello, " + name
sayHello: (name: String)Unit
scala> sayHello("xx")
scala>
#结束
scala
方法到此结束