Scala函数

1. 方法的定义和使用

  1. 不需要return

  2. 没有参数的时候可以不用括号

    def 方法名(参数名:参数类型): 返回值类型 = {
      // 括号内的叫做方法体
      
      // 方法体内的最后一行为返回值, 不需要使用return
    }
    
  3. 一个例子

    /**
     * Author: 3zZ.
     * Date: 2020/1/2 10:30 下午
     */
    object FunctionApp {
      def main(args: Array[String]): Unit = {
        println(add(2, 3))
        println(three())
        println(three) // 没有入参的函数 调用的时候 括号是可以省略的
        sayHello("zhangsan")
        sayHello
      }
      def add(x: Int, y: Int): Int = {
        x + y // 最后一行就是返回值
      }
      def three() = 1+2
      def sayHello(): Unit ={
        println("say hello")
      }
      def sayHello(name:String): Unit ={
        println("say hello "+name)
      }
    }
    
    // 返回的结果如下
    5
    3
    3
    say hello zhangsan
    say hello
    

2. 默认参数、命名参数

  1. 在函数定义时,允许指定参数的默认值

  2. 在参数调用的时候,可以指定名字改变参数的顺序

  3. 一个例子

    /**
     * Author: 3zZ.
     * Date: 2020/1/2 10:30 下午
     */
    object FunctionApp {
      def main(args: Array[String]): Unit = {
        sayName()// 这里括号不能省略
        sayName("2yy")
        println(speed(100,10))
        println(speed(time = 5,distance = 100)) // 命名参数 可以将参数的顺序调换
      }
    
      def sayName(name:String="3zz"): Unit ={
        println(name)
      }
      def speed(distance:Float, time:Float): Float ={
        distance / time
      }
    }
    // 返回的结果
    3zz
    2yy
    10.0
    20.0
    

3. 可变参数

  1. JDK5+:可变参数

  2. Spark-sql中源码

    // Dataset.scala文件中的select方法
    @scala.annotation.varargs
    def select(cols: Column*): DataFrame = withPlan {
      Project(cols.map(_.named), logicalPlan)
    }
    
    @scala.annotation.varargs
    def select(col: String, cols: String*): DataFrame = select((col +: cols).map(Column(_)) : _*)
    
  3. 一个小例子

    /**
     * Author: 3zZ.
     * Date: 2020/1/2 10:30 下午
     */
    object FunctionApp {
      def main(args: Array[String]): Unit = {
        println(sum2(1,3,5))
      }
      def sum2(numbers:Int*) = {
        var result = 0
        for(number <- numbers){
          result+=number
        }
        result
      }
    }
    // 返回的结果
    9
    

4. 条件表达式

  • Java用法基本相同
val x = 1
if(x > 0){
  true
} else {
  false
}

5. 循环表达式

  • to关键字:范围包含两边

    1 to 10
    res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    // 包含了 1 和 10
    // 另外一种写法
    1.to(10)
    res2: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
  • Range关键字:左闭右开

    Range(1,10)
    res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
    // 没有10
    Range(1,10,2)
    res3: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
    
  • until关键字:左闭右开

    1 until 10
    res4: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
    
  • for循环 / foreach方法

    // 第一种方法 使用for循环
    val courses = Array("1a","2b","3c","4d")
    for(course <- sources) {
      println(course)
    }
    // 输出 1a,2b,3c,4d
    // 第二种方法 使用foreach
    courses.foreach(course => println(course))
    // => : 相当于将course作用上右边的函数 变成另外一个结果
    // 输出 1a,2b,3c,4d
    
  • while循环

    var (num, sum) = (100,0)
    while(num > 0){
      sum= sum + num
      num= num - 1
    }
    println(sum)
    // 输出5050