亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Scala方法與函數使用和定義詳解

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

一、方法的定義

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

2.如果方法體重沒有return, 默認將 方法體中最后一行計算的結果當作返回值返回. 方法體的返回值可以省略, 會自動推斷

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

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

5.如果定義方法時, 省略了方法名稱和方法體之間的"=", 那么無論方法體最后一行計算的結果是什么, 都會被丟棄, 返回Unit

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

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

二、遞歸方法

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

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

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

三、參數有默認值的方法

1.默認值的函數中,如果傳入的參數個數與函數定義相同,則傳入的數值會覆蓋默認值

2.如果不想覆蓋默認值,傳入的參數個數小于定義的函數的參數,則需要指定參數名稱

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

四、可變參數個數的函數

多個參數之間逗號分開

def fun4(elements: Int*) = {
  println(elements)
  elements.foreach(i => println(i))
  // 當匿名函數的元素只用到一次的時候, 可以用_簡寫
  elements.foreach(println(_))
  // 當方法入參為單個參數時且正好是匿名函數的元素時, 進一步簡寫
  elements.foreach(println)
  var sum = 0;
  for (elem <- elements) {
    sum += elem
  }
  sum
}

五、匿名函數

注意函數的寫法與方法的寫法有些許的不同,出現 => 符號就認為是函數,但實際使用上效果并無不同,僅僅是語法上的細微區(qū)別

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

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

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

/**
 * 常用的匿名函數寫法: 可以將匿名函數返回給定義的一個變量, 看到“=>”就是匿名函數
 * 多用于方法的參數是函數時(函數指針),用匿名函數簡寫
 *
 * @param args
 */
def main(args: Array[String]): Unit = {
  /**
   * 有參數匿名函數
   */
  val value1: (Int) => Unit = (a: Int) => {
    println(a)
  }
  value1(1)
  /**
   * 無參數匿名函數
   */
  val value2 = () => {
    println("我愛學習")
  }
  value2()
  /**
   * 有返回值的匿名函數
   */
  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)
}

七、偏應用函數(部分應用函數)

某些情況下, 方法中參數非常多, 調用這個方法非常頻繁, 每次調用只有固定的某個參數變化, 其他都不變, 可以定義偏應用來實現

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,"當前時間")
  // 想要調用log, 以上變化的是第二個參數, 可以用偏應用函數處理
  // 把showLog()方法定義為偏應用函數
  val logWithDate = showLog(date,_:String)
  // 第二種函數寫法
  def logWithDate2 = showLog(date,_:String)
  logWithDate("偏應用函數-log11")
  logWithDate("偏應用函數-log22")
  logWithDate("偏應用函數-log33")
}

八、高階函數

函數的參數是函數,或者函數的返回類型是函數,或者函數的參數和函數的返回類型是函數的函數.

  /**
   * 普通的方法
   *
   * @param a
   * @param b
   * @return
   */
  def fun(a: Int, b: Int): Int = {
    a + b
  }
  /**
   * 使用 _把方法強轉為一個函數
   */
  private val function: (Int, Int) => Int = fun _
  /**
   * 函數的參數是函數: 函數的類型 (Int, Int) => Int, 記住: 方法的引用僅為方法本身,需要重新賦實參
   *
   * @param f 函數作為參數
   * @param a
   * @return
   */
  def fun1(f: (Int, Int) => Int, a: Int): Int = {
    f(a, 100)
  }
  /**
   * 函數的返回是函數: 必須要顯示地寫出返回值類型, 或者使用 f2 _
   *
   * @param a
   * @param b
   * @return
   */
  def fun2(a: Int, b: Int): (Int, Int) => Int = {
    // 在內部定義了一個方法
    def f2(v1: Int, v2: Int): Int = {
      v1 + v2 + a + b
    }
    f2
  }
  /**
   * 函數的參數是函數,函數的返回是函數
   *
   * @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
  }
  /**
   * 函數入口
   *
   * @param args
   */
  def main(args: Array[String]): Unit = {
    // 顯示聲明過的函數作為參數
    println("顯示聲明過的函數作為參數: " + fun1(fun, 100))
    // 匿名函數作為參數: 匿名函數入參的類型可以省略不寫
    println("匿名函數作為參數: " + fun1((a: Int, b: Int) => {
      a * b
    }, 100))
    // 返回值是一個函數
    println("返回值是一個函數: " + fun2(1, 2)(3, 4))
    // 入參和出參都是函數
    println("入參和出參都是函數: " + fum3(fun)("hello", "scala!"))
    println("入參和出參都是函數: " + fum3((a, b) => a * b)("hello", "scala!"))
  }

筆者注:高階函數這塊內容會相對較為難以理解,可以先記住這種結構

九、柯里化函數

柯里化函數: 本質上就是對返回值是函數的方法的一種簡化寫法

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

注:fun7(1, 2)(3, 4)可以理解成先運算fun7(1,2)返回了一個fun7函數對象,再對他進行參數(3,4)的賦值

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

相關文章

  • Java 繼承與多態(tài)超詳細梳理

    Java 繼承與多態(tài)超詳細梳理

    繼承就是可以直接使用前輩的屬性和方法。自然界如果沒有繼承,那一切都是處于混沌狀態(tài)。多態(tài)是同一個行為具有多個不同表現形式或形態(tài)的能力。多態(tài)就是同一個接口,使用不同的實例而執(zhí)行不同操作
    2022-04-04
  • Java字符轉碼之UTF-8互轉GBK具體實現

    Java字符轉碼之UTF-8互轉GBK具體實現

    在Java程序中字符串默認的編碼方式是UTF-16編碼,因此需要將GBK編碼轉換為UTF-8編碼,主要是為了避免出現亂碼的情況,這篇文章主要給大家介紹了關于Java字符轉碼之UTF-8互轉GBK具體實現的相關資料,需要的朋友可以參考下
    2023-11-11
  • 關于Java中靜態(tài)代碼塊的執(zhí)行淺析

    關于Java中靜態(tài)代碼塊的執(zhí)行淺析

    這篇文章主要給大家介紹了關于Java中靜態(tài)代碼塊執(zhí)行的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • SpringBoot異常處理之異常顯示的頁面問題

    SpringBoot異常處理之異常顯示的頁面問題

    這篇文章主要介紹了SpringBoot異常處理異常顯示的頁面的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 圖解JAVA中Spring Aop作用

    圖解JAVA中Spring Aop作用

    這篇文章主要介紹了Java的Spring框架下的AOP的作用,需要的朋友可以參考
    2017-04-04
  • Java?KeyGenerator.generateKey的19個方法代碼示例

    Java?KeyGenerator.generateKey的19個方法代碼示例

    在下文中一共展示了KeyGenerator.generateKey方法的19個代碼示例,這些例子默認根據受歡迎程度排序
    2021-12-12
  • jsch中ChannelShell與ChannelExec的區(qū)別及說明

    jsch中ChannelShell與ChannelExec的區(qū)別及說明

    這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java正則表達式簡單使用和網頁爬蟲的制作代碼

    java正則表達式簡單使用和網頁爬蟲的制作代碼

    java正則表達式簡單使用和網頁爬蟲的制作代碼,需要的朋友可以參考一下
    2013-05-05
  • Http學習之組裝報文

    Http學習之組裝報文

    這篇文章主要介紹了Http學習之組裝報文,組裝報文就是指組裝HTTP響應報文,你需要返回客戶請求的相應資源,通常一個完整的報文包括報文頭和報文體,一起來看看吧
    2023-04-04
  • SpringBoot中實現定時任務的幾種方式

    SpringBoot中實現定時任務的幾種方式

    定時任務在我們項目開發(fā)中也是很重要的,對于某些場景必須要用定時任務?,如定時發(fā)送郵件啊,定時統(tǒng)計數據等,這篇文章主要講講項目中實現定時任務的幾種方式,需要的朋友可以參考下
    2023-05-05

最新評論