最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Scala方法與函數(shù)使用和定義詳解

 更新時(shí)間:2022年12月14日 14:36:01   作者:Cry丶  
這個(gè)章節(jié)會(huì)很燒腦,需要認(rèn)真研讀,我會(huì)盡量寫(xiě)的詳細(xì)一些。 方法和函數(shù),看似是兩個(gè)概念,其實(shí)他嚴(yán)格來(lái)說(shuō)也是兩個(gè)概念,但我們大可以理解成是同一個(gè)概念,在使用時(shí)只有語(yǔ)法上的細(xì)微差別,是很類似的,都理解為function即可

一、方法的定義

1.方法體中最后返回值可以使用return, 如果使用了return, 那么方法體的返回值類型一定要指定

2.如果方法體重沒(méi)有return, 默認(rèn)將 方法體中最后一行計(jì)算的結(jié)果當(dāng)作返回值返回. 方法體的返回值可以省略, 會(huì)自動(dòng)推斷

3.定義方法傳入的參數(shù)一定要指定類型

4.方法的方法體如果只有一行, 那么方法體的“{…}”可以省略

5.如果定義方法時(shí), 省略了方法名稱和方法體之間的"=", 那么無(wú)論方法體最后一行計(jì)算的結(jié)果是什么, 都會(huì)被丟棄, 返回Unit

def max(a: Int, b: Int) = {
  if (a > b) {
    "哈哈"
  } else {
    b
  }
}
// 語(yǔ)法糖: 方法定義
def max0(a: Int, b: Int) = if (a > b) a else b

注:記住def定義的格式,按著格式敲即可,不要糾結(jié)

二、遞歸方法

遞歸方法必須要顯示指定返回體的類型

def fun2(num: Int): Int = {
  if (num == 1)
    num
  else
    num * fun2(num - 1)
}
// 語(yǔ)法糖
def fun2(num:Int) : Int = if (num == 1) num else num * fun2(num - 1)

注:編譯器無(wú)法直接推斷出你最終遞歸的結(jié)果類型,所以需要你顯示指定

三、參數(shù)有默認(rèn)值的方法

1.默認(rèn)值的函數(shù)中,如果傳入的參數(shù)個(gè)數(shù)與函數(shù)定義相同,則傳入的數(shù)值會(huì)覆蓋默認(rèn)值

2.如果不想覆蓋默認(rèn)值,傳入的參數(shù)個(gè)數(shù)小于定義的函數(shù)的參數(shù),則需要指定參數(shù)名稱

def fun3(a: Int = 10, b: Int) = {
  println(a + b)
}

四、可變參數(shù)個(gè)數(shù)的函數(shù)

多個(gè)參數(shù)之間逗號(hào)分開(kāi)

def fun4(elements: Int*) = {
  println(elements)
  elements.foreach(i => println(i))
  // 當(dāng)匿名函數(shù)的元素只用到一次的時(shí)候, 可以用_簡(jiǎn)寫(xiě)
  elements.foreach(println(_))
  // 當(dāng)方法入?yún)閱蝹€(gè)參數(shù)時(shí)且正好是匿名函數(shù)的元素時(shí), 進(jìn)一步簡(jiǎn)寫(xiě)
  elements.foreach(println)
  var sum = 0;
  for (elem <- elements) {
    sum += elem
  }
  sum
}

五、匿名函數(shù)

注意函數(shù)的寫(xiě)法與方法的寫(xiě)法有些許的不同,出現(xiàn) => 符號(hào)就認(rèn)為是函數(shù),但實(shí)際使用上效果并無(wú)不同,僅僅是語(yǔ)法上的細(xì)微區(qū)別

原生的匿名函數(shù)寫(xiě)法(基本不用):(Int, Int) => Int就是他的類型

/**
 * 原生的匿名函數(shù)寫(xiě)法(基本不用)
 * @return
 */
def fun: (Int, Int) => Int = (a: Int, b: Int) => {
  a + b
}

常用的匿名函數(shù)寫(xiě)法: 可以將匿名函數(shù)返回給定義的一個(gè)變量, 看到“=>”就是匿名函數(shù), 多用于方法的參數(shù)是函數(shù)時(shí)(函數(shù)指針),用匿名函數(shù)簡(jiǎn)寫(xiě)

/**
 * 常用的匿名函數(shù)寫(xiě)法: 可以將匿名函數(shù)返回給定義的一個(gè)變量, 看到“=>”就是匿名函數(shù)
 * 多用于方法的參數(shù)是函數(shù)時(shí)(函數(shù)指針),用匿名函數(shù)簡(jiǎn)寫(xiě)
 *
 * @param args
 */
def main(args: Array[String]): Unit = {
  /**
   * 有參數(shù)匿名函數(shù)
   */
  val value1: (Int) => Unit = (a: Int) => {
    println(a)
  }
  value1(1)
  /**
   * 無(wú)參數(shù)匿名函數(shù)
   */
  val value2 = () => {
    println("我愛(ài)學(xué)習(xí)")
  }
  value2()
  /**
   * 有返回值的匿名函數(shù)
   */
  val value3 = (a: Int, b: Int) => {
    a + b
  }
  println(value3(4, 4))
}

六、嵌套方法

/**
 * 嵌套方法
 * 例如:嵌套方法求5的階乘
 */
def fun5(num: Int) = {
  def fun6(a: Int, b: Int): Int = {
    if (a == 1) {
      b
    } else {
      fun6(a - 1, a * b)
    }
  }
  fun6(num, 1)
}

七、偏應(yīng)用函數(shù)(部分應(yīng)用函數(shù))

某些情況下, 方法中參數(shù)非常多, 調(diào)用這個(gè)方法非常頻繁, 每次調(diào)用只有固定的某個(gè)參數(shù)變化, 其他都不變, 可以定義偏應(yīng)用來(lái)實(shí)現(xiàn)

def showLog(date :Date, log :String)= {
  println(s"date is $date, log is $log")
}
def main(args: Array[String]): Unit = {
  val date = DateUtil.date(new Date())
  showLog(date,"當(dāng)前時(shí)間")
  // 想要調(diào)用log, 以上變化的是第二個(gè)參數(shù), 可以用偏應(yīng)用函數(shù)處理
  // 把showLog()方法定義為偏應(yīng)用函數(shù)
  val logWithDate = showLog(date,_:String)
  // 第二種函數(shù)寫(xiě)法
  def logWithDate2 = showLog(date,_:String)
  logWithDate("偏應(yīng)用函數(shù)-log11")
  logWithDate("偏應(yīng)用函數(shù)-log22")
  logWithDate("偏應(yīng)用函數(shù)-log33")
}

八、高階函數(shù)

函數(shù)的參數(shù)是函數(shù),或者函數(shù)的返回類型是函數(shù),或者函數(shù)的參數(shù)和函數(shù)的返回類型是函數(shù)的函數(shù).

  /**
   * 普通的方法
   *
   * @param a
   * @param b
   * @return
   */
  def fun(a: Int, b: Int): Int = {
    a + b
  }
  /**
   * 使用 _把方法強(qiáng)轉(zhuǎn)為一個(gè)函數(shù)
   */
  private val function: (Int, Int) => Int = fun _
  /**
   * 函數(shù)的參數(shù)是函數(shù): 函數(shù)的類型 (Int, Int) => Int, 記住: 方法的引用僅為方法本身,需要重新賦實(shí)參
   *
   * @param f 函數(shù)作為參數(shù)
   * @param a
   * @return
   */
  def fun1(f: (Int, Int) => Int, a: Int): Int = {
    f(a, 100)
  }
  /**
   * 函數(shù)的返回是函數(shù): 必須要顯示地寫(xiě)出返回值類型, 或者使用 f2 _
   *
   * @param a
   * @param b
   * @return
   */
  def fun2(a: Int, b: Int): (Int, Int) => Int = {
    // 在內(nèi)部定義了一個(gè)方法
    def f2(v1: Int, v2: Int): Int = {
      v1 + v2 + a + b
    }
    f2
  }
  /**
   * 函數(shù)的參數(shù)是函數(shù),函數(shù)的返回是函數(shù)
   *
   * @param f
   * @return
   */
  def fum3(f: (Int, Int) => Int): (String, String) => String = {
    val i = f(1, 2)
    def fun1(s1: String, s2: String): String = {
      s1 + "@" + s2 + "$" + i
    }
    fun1
  }
  /**
   * 函數(shù)入口
   *
   * @param args
   */
  def main(args: Array[String]): Unit = {
    // 顯示聲明過(guò)的函數(shù)作為參數(shù)
    println("顯示聲明過(guò)的函數(shù)作為參數(shù): " + fun1(fun, 100))
    // 匿名函數(shù)作為參數(shù): 匿名函數(shù)入?yún)⒌念愋涂梢允÷圆粚?xiě)
    println("匿名函數(shù)作為參數(shù): " + fun1((a: Int, b: Int) => {
      a * b
    }, 100))
    // 返回值是一個(gè)函數(shù)
    println("返回值是一個(gè)函數(shù): " + fun2(1, 2)(3, 4))
    // 入?yún)⒑统鰠⒍际呛瘮?shù)
    println("入?yún)⒑统鰠⒍际呛瘮?shù): " + fum3(fun)("hello", "scala!"))
    println("入?yún)⒑统鰠⒍际呛瘮?shù): " + fum3((a, b) => a * b)("hello", "scala!"))
  }

筆者注:高階函數(shù)這塊內(nèi)容會(huì)相對(duì)較為難以理解,可以先記住這種結(jié)構(gòu)

九、柯里化函數(shù)

柯里化函數(shù): 本質(zhì)上就是對(duì)返回值是函數(shù)的方法的一種簡(jiǎn)化寫(xiě)法

def fun7(a: Int, b: Int)(c: Int, d: Int) = {
  a + b + c + d
}
/**
 * 函數(shù)入口
 *
 * @param args
 */
def main(args: Array[String]): Unit = {
  println(fun7(1, 2)(3, 4))
}

注:fun7(1, 2)(3, 4)可以理解成先運(yùn)算fun7(1,2)返回了一個(gè)fun7函數(shù)對(duì)象,再對(duì)他進(jìn)行參數(shù)(3,4)的賦值

到此這篇關(guān)于Scala方法與函數(shù)使用和定義詳解的文章就介紹到這了,更多相關(guān)Scala方法與函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

德江县| 和林格尔县| 黄梅县| 泽库县| 夏河县| 澎湖县| 张家港市| 苏尼特右旗| 盱眙县| 开阳县| 山西省| 叙永县| 南陵县| 四川省| 门源| 玛纳斯县| 富锦市| 洞口县| 吉首市| 涪陵区| 玉环县| 井陉县| 丰宁| 通州市| 双城市| 灵璧县| 丰镇市| 内丘县| 丁青县| 克拉玛依市| 阳高县| 开平市| 光山县| 宜黄县| 阳泉市| 聊城市| 教育| 余姚市| 正镶白旗| 新干县| 儋州市|