编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

Scala基础语法:函数

Scala基础语法:函数

函数的定义与调用

scala> :paste// Entering paste mode (ctrl-D to finish)def sayHello(name:String, age:Int)={ if (age > 18){
  printf("hi %s, you are a big boy\n", name)
  age
 } else{
  printf("hi %s,you are a little boy\n",name)
  age
 }
}// Exiting paste mode, now interpreting.sayHello: (name: String, age: Int)Intscala> sayHello("leo", 30)
hi leo, you are a big boy
res35: Int = 30
  • 单行函数

scala > def sayHello(name: String) = print("Hello, " + name)

函数和函数体之间加等号说明有返回值。

函数默认参数和带名参数

scala> def sayHello(firstName: String, middleName: String = "William", lastName: String = "Croft") = firstName + " " + middleName + " " + lastName
sayHello: (firstName: String, middleName: String, lastName: String)Stringscala> sayHello("leo")
res2: String = leo William Croftscala> sayHello(firstName = "Mick", lastName = "Nina", middleName = "Jack")
res3: String = Mick Jack Ninascala> sayHello("Mick", lastName = "Nina", middleName = "Jack")
res4: String = Mick Jack Nina

带名参数可以不按照函数定义的参数顺序来传递参数,而是使用带名参数的方式来传递。还可以混合使用未命名参数和带名参数,但是未命名参数必须排在带名参数前面。

可变参数

scala> :paste// Entering paste mode (ctrl-D to finish)def sum(nums:Int*) = {var res = 0for(num  sum(1 to 5:_*)
res8: Int = 15

使用Scala特殊的语法将参数定义为序列: sum(1 to 5:_*)

过程、lazy和异常

  • 在Scala中,定义函数时,如果函数体直接包裹在了花括号里面,而没有使用=连接,则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。

  • 在Scala中,提供了lazy值的特性,也就是说,如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会发生计算。这种特性对于特别耗时的计算操作特别有用,比如打开文件进行IO,进行网络IO等。

  • 即使文件不存在,也不会报错,只有第一个使用变量时会报错,证明了表达式计算的lazy特性

scala> val lines = fromFile("C://Users//htfeng//Desktop//test.txt").mkString
  • 异常

scala> :paste// Entering paste mode (ctrl-D to finish)try {  throw new IllegalArgumentException("x should not be negative") // 抛出异常} catch {  case _: IllegalArgumentException => println("Illegal Argument!") // 捕获异常} finally {
  print("release resources!")
}// Exiting paste mode, now interpreting.Illegal Argument!release resources!scala> import java.io._import java.io._scala> :paste// Entering paste mode (ctrl-D to finish)try {  throw new IOException("user defined exception")
} catch {  case e1: IllegalArgumentException => println("illegal argument")  case e2: IOException => println("io exception")
}// Exiting paste mode, now interpreting.io exception

scala>
未经允许不得转载: Scala基础语法:函数