Scala-functions

Scala functions

Code example

       

import java.time.LocalDateTime

/**
  * 1. object 中才能使用main函数
  * 2. 函数中可以有函数
  * 3. 函数不写等号 代表没有返回值 unit,
  *    有等号但没指定类型那么最后一行是什么类型就返回什么类型
  *    通过 :类型  指定返回值
  *    可以使用return返回,使用return的时候必须指定返回值类型
  * 4. 函数中的参数是val修饰的 不可变的
  */
object TestScalaFunction {
   // main函数
  def main(args: Array[String]): Unit = {
    //1. 声明一个函数,接受int 类型的 a ,b 两个参数,返回值为int
    def fun01(a: Int,b: Int) = {
      // 最后一行是什么代表返回什么类型值(前提没指定返回类型)
      a + b
    }
    println(fun01(23,3))
    //2. 递归
    def RecursionFun(num: Int): Int = {
      if(num == 1) {
        1
      }else{
        num + RecursionFun(num-1)
      }
    }
    println(RecursionFun(10000))
    // 3. 可变参数使用 *号;带有默认是的参数 使用 =号,例如 a:Int=10;
    def fun02(a: Int*): Unit = {
//      a.foreach(println)
//      a.foreach(println(_))
//      a.foreach(s => {print(s + "\t")})
      for (elem <- a) {
        print(elem + " \t")
      }
    }
    fun02(12,12,23,34,34,343,34,45,45,56)
    println()

    // 4. 匿名函数
    val fun03 = () => println("23232")
    def fun04 = (str: String, str2: String) => {println(str + "-" + str2)}
    fun03()
    fun04("xiaoming","12")
    println()

    // 5. 偏应用函数
    // localDateTime是java8中的时间,scala可以调用java中的类库
    def log(date: LocalDateTime,name: String,log: String): Unit ={
      println(date + " == : " + name +"操作了 "+log)
    }
//    让log函数变为一个偏应用函数 是用_ 表示这个参数需要填写
    val logto = log(LocalDateTime.now(),_: String,_:String)
    logto("小明","添加")
    logto("小明","删除")
    logto("小明","修改")

    /**
      * 高阶函数
      */
    //1. 参数为函数
    def fun05(f01:(Int,Int) => Int,a:Int,b:Int,str:String): Unit = {
      // 参数为function 直接能调用,具体实现由调用者实现
      println(str + " 计算结果 = "+ f01(a,b) )

    }
    // 传入一个匿名函数,也可以声明一个函数传入
    fun05((a,b)=>a+b,12,12,"小明")

    //2. 返回值为函数
    def fun06(a: Int,b: Int): () => String = {
      if(a < b){
        // 如果 a<0  实现一个函数
        def f() = {
            "a 小于 b"
        }
        // 返回这个函数
        f
      }else{
        def f() = {
          "a 大于 b"
        }
        f
      }
    }
    println(fun06(-1,4)())
    println(fun06(6,4)())
    //3. 参数和返回值都包含函数
    def fun07(f01:(Int,Int)=> Boolean,a:Int,b:Int): (String,String)=>String = {
      var flag = f01(a,b)
        if(flag){
          def f(name1: String,name2: String):String ={
            name1 + " 的分数大于 " + name2
          }
          f
        }else {
          def f(name1: String,name2: String):String ={
            name1 + " 的分数小于 " + name2
          }
          f
        }
    }

    println(fun07((a,b) => a > b,14,12)("小明","小红"))

    //4. 特殊高阶函数(简化版 返回值是个函数 柯里化函数)
    def fun08(f01:(Int,Int)=> Int,a:Int,b:Int)(int: Int) ={
      f01(a,b) + int
    }
    def fun09(a: Int)(b: Int) ={
       a+ b
    }
    println(fun08((a,b) => a - b,1,4)(10))
    println((fun09(12)(23)))

  }


}

 

Guess you like

Origin blog.csdn.net/xiaodujava/article/details/88993142