一、定义

方法:Scala 中的方法跟 Java 的类似,方法是组成类的一部分。
函数:Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。

函数可作为一个参数传入到方法中,而方法不行。

注意:函数体的最后一行为返回值,不需要使用 return
如图,要么返回 x,要么返回 y

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println(add(2, 3))
    println(three) // 不需要参数的时候,可以省略括号
    sayHello
  }

  def add(x: Int, y: Int):Int = {
    x + y // 最后一行就是 返回值,不需要return
  }


  // 只有一行代码,省略了大括号;这里也可以判断出返回类型是int,所以返回类型也可以省略
  def three() = 1 + 2 

  // Unit,表示没有返回值
  def sayHello(): Unit ={
    println("Say Hello ...")
  }

}

二、默认参数

默认参数的情况,调用函数,括号不能省略

def sayName(name:String = "周杰伦"): Unit ={
    println(name)
}

三、命名参数

def speed(distance: Float, time: Float):Float = {
    distance / time
}
println(speed(100, 10))  // 直接按顺序传入参数
println(speed(distance = 100, time = 10)) // 按顺序命名传入参数
println(speed(time = 10, distance = 100)) // 随意顺序,命名传入参数

命名参数,参数名字相同即可

四、可变参数

可变参数必须在最后一个参数定义,最后定义的参数后面加 * 号即可

object ArrayApp extends App {

  def echo(args: String*): Unit = {
    for (arg <- args){
      println(arg)
    }
  }
  echo("php", "java", "scala")
}

输出

php
java
scala

:_* 转换参数序列

object ArrayApp extends App {

  def echo(args: String*): Unit = {
    for (arg <- args){
      println(arg)
    }
  }
  val arr  = Array("php", "java", "scala")
  echo(arr :_*)  // 这里需要把 arr 数组转化为参数序列,相当于把数组里面每个元素当作多个参数传进去
}

传入数组参数序列

object ArrayApp extends App {

  def echo(args:Array[String]*): Unit = {
    for (arg <- args){
      println(arg)
    }
  }
  val arr1  = Array("php", "java", "scala")
  val arr2  = Array("c", "c++", "go")
  echo(arr1, arr2) // 传入数组参数序列
}