日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[scala-spark]4. 函数式编程

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [scala-spark]4. 函数式编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 幾個概念說明

  • 在Scala中,方法與函數幾乎可以等同(定義 使用 運行機制),只是函數的使用方法更加靈活多樣
  • 函數式編程是從編程方式的角度來談的。函數式編程把函數當成一等公民,充分利用函數、支持函數的多種使用方式(調用)。既可以作為函數的參數使用,也可以將函數賦值給一個變量;此外函數的創建不用依賴類或者對象,而在Java中,函數的創建需要依賴類/抽象類或者接口
package com.lineshen.chapter5object method2FunctionDemo {def main(args: Array[String]): Unit = {val dog = new Dogval res1 = dog.sum(10, 20)println(res1)//方法轉成函數val func = dog.sum _val res2 = func(20, 30)println(res2)//函數編程val func2 = (n1: Int, n2: Int) => n1 + n2val res3 = func2(30,40)println(res3)} }class Dog {def sum(n1: Int, n2: Int): Int = {n1 + n2} }>>30 >>50 >>70

函數的基本約定:

def 函數名([參數名:參數類型], ... ) [[:返回類型]] = {函數體return 返回值 }
  • 函數申明關鍵字是 def
  • [參數:參數類型] 表示函數的輸入,可以沒有,如果有多個,用逗號分割
  • 函數中的語句是為了實現某一功能的代碼塊
  • 函數可以有返回值,也可以沒有;最好使用=,直接進行返回類型的推導
  • 如果沒有 reture ,默認以執行到最后一行的結果作為返回值
package com.lineshen.chapter5object FunDemo1 {def main(args: Array[String]): Unit = {val n1 = 1val n2 = 2println("sum="+getSum(n1,n2,"+"))}def getSum(n1: Int, n2: Int,opt: String) = {if (opt == "+"){n1 + n2} else if (opt == "-"){n1 - n2} else {null}} }

本例中,n1+n2 / n1-n2 與 null的類型無法統一,就可以直接使用=進行返回類型的推導。

2. 函數遞歸

函數遞歸需要遵守的重要規則:

  • 程序執行函數時,就會創建一個新的受保護的獨立空間(新函數棧)
  • 函數的局部變量是相互獨立的,不會相互影響
  • 遞歸必須向逼近遞歸的條件逼近,否則就是無限遞歸

3. 函數的注意事項以及使用細節

  • 如果函數沒有形參,那么函數調用過程中,不用寫()
  • 形參列表和返回值列表的數據類型可以是值類型,也可以是引用類型
package com.lineshen.chapter5object funcDetails {def main(args: Array[String]): Unit = {val tiger0 = new tigerprintln(tiger0.name)val tiger1 = test(100, tiger0)println(tiger1.name)}def test(n1:Int, tiger0:tiger): tiger= {println("n1="+ n1)tiger0.name = "jack"tiger0} }class tiger{var name = "lineshen" }

輸出結果: lineshen 100 jack

  • Scala中的函數可以根據函數體最后一行代碼自動推斷函數的返回值類型,該種情況下,return也可以不用寫
  • 因為Scala可以自動推斷返回值類型,因此,直接使用=就好了,或者用[:Any=]
  • 一旦使用return,就必須指定返回值類型 [:返回值類型];如果不指定,就是表示該函數沒有任何返回值
  • 如果函數返回值制定了Unit,那么return無效
  • Scala支持高級嵌套,如類中可以再一次聲明類;方法中可以繼續定義方法
package com.lineshen.chapter5object dupFunc {def main(args: Array[String]): Unit = {def sayOK(): Unit = { // private final sayOK$1println("say ok")def sayOK(): Unit = { // private final sayOK$2println("say ok, say ok")}}} }
  • 形參可以進行初始化,默認調用;實參會覆蓋形參;可以指定覆蓋特定的形式參數默認值【帶名參數】
  • Scala中的形參默認為是val,函數體中不允許去修改
  • 遞歸無法進行類型自動推導,必須指定返回類型
  • 支持可變形參,用for進行解析

4. 惰性函數

惰性計算(盡可能延遲表達式求值)是許多函數式編程語言的特性。惰性集合在需要時提供其元素,無需預先計算它們,這帶來了一些好處。首先,可以將耗時的計算推遲到絕對需要的時候。其次,可以創造無限個集合,只要它們繼續收到請求,就會繼續提供元素。函數的惰性使用能夠得到更高效的代碼。Java并沒有為惰性提供原生支持, Scala提供了,使用很方便。

object layDemo {def main(args: Array[String]): Unit = {lazy val res = sum(10, 20)println("-------------")println("-------------")println("-------------")println(res)}def sum(n1: Int, n2: Int): Int = {n1 + n2}

輸出結果(lazy函數只能用val進行修飾,為了保證線程安全):

-------------
-------------
-------------
30

5. 異常處理

  • 拋出異常

Scala 拋出異常的方法和 Java一樣,使用 throw 方法,例如,拋出一個新的參數異常:

throw new IllegalArgumentException
  • 捕捉異常

異常捕捉的機制與其他語言中一樣,如果有異常發生,catch字句是按次序捕捉的。因此,在catch字句中,越具體的異常越要靠前,越普遍的異常越靠后。 如果拋出的異常不在catch字句中,該異常則無法處理,會被升級到調用者處。

捕捉異常的catch子句,語法與其他語言中不太一樣(java使用了try-catch-catch-finnaly 無論有沒有異常 finally代碼塊都會執行,一般用來釋放資源)。在Scala里,借用了模式匹配的思想來做異常的匹配,因此,在catch的代碼里,是一系列case字句,如下例所示:

import java.io.FileReader import java.io.FileNotFoundException import java.io.IOExceptionobject exceptionDemo {def main(args: Array[String]) {try {val f = new FileReader("input.txt")} catch {case ex: FileNotFoundException => {println("Missing file exception")}case ex: IOException => {println("IO Exception")}}finally{println("Programming has run")}} }

輸出結果:

Missing file exception
Programming has run? ?【實際應用中,一般用于釋放資源】

總結

以上是生活随笔為你收集整理的[scala-spark]4. 函数式编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。