一.高階函數

一.函數式編程中函數的特點

  1. 可以創建匿名函數
    def聲明帶名函數,val聲明匿名函數
    scala scala> def triple(x:Int):Int = {3*x} scala> triple(2) res1: Int = 6
    scala scala> val triple = (x:Int) => 3*x scala> triple(2) res0: Int = 6

  2. 函數和數字一樣,可以作為參數被傳遞和操作
    scala scala> val fun = scala.math.ceil _ // _ 把函數轉變為變量 scala> Array(1.1,2.2,3.3).map(fun) res2: Array[Double] = Array(2.0, 3.0, 4.0)

  3. 聲明以函數為參數的函數
    以函數為參數時,要給出函數名,參數類型,返回值類型,作為算法的約束條件。eg:f:(Double)=>Double
    以函數為參數的函數,他的函數體要用聲明前面的函數名。eg:f(0.25)
    ```scala
    scala> def valeOnQuarter(f:(Double)=>Double) = f(0.25)
    valeOnQuarter: (f: Double => Double)Double

    scala> valeOnQuarter(scala.math.ceil _)
    res4: Double = 1.0
    匿名函數作為參數傳遞給另一個函數作為算法時,該匿名函數會自行做參數類型推斷,自動識別算法的參數和返回值類型,可以不去聲明scala
    // 匿名函數作為算法的完整寫法
    scala> valeOnQuarter((x:Double)=>3x)
    res5: Double = 0.75
    // 參數值推斷的寫法
    scala> valeOnQuarter(x=>3
    x)
    res6: Double = 0.75
    // 終極簡化寫法
    scala> valeOnQuarter(3*_)
    res7: Double = 0.75
    【注】:匿名函數作為參數值時,之所以可以做參數類型推斷,是因為以算法為參數的函數的函數體給出了參數值。如果把一個val變量聲明為匿名函數,則要給出參數類型,以便scala推斷返回值類型scala
    scala> val fun = 3*( _: Double)
    fun: Double => Double =

    scala> fun(2)
    res8: Double = 6.0
    ```

二.集合類中有用的高階函數(算法為參數)

  1. map與foreach

    scala> (1 to 4).map("*" * _).foreach(println)
    *
    **
    ***
    ****
  2. filter

    scala> (1 to 9).filter(_% 2==0)
    res14: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)
  3. reduceLeft

    scala> (1 to 4).reduceLeft(_*_)
    res16: Int = 24
  4. sortWith

    scala> "i have a dream".split(" ").sortWith(_.length < _.length)
    res21: Array[String] = Array(i, a, have, dream)

三.閉包

  1. 閉包:
    一個函數的函數體內,所用到的變量沒有全部在函數內部定義。函數內部定義的變量稱為綁定變量,函數未定義的稱為自由變量。此時含有未定義變量的函數文本處于“開放”狀態,當自由變量根據函數上文動態推斷而來后,函數文本“關閉”,次過程稱為函數的閉包。
    即:函數從變量個數 > 參數列表個數到變量個數 = 參數列表個數的過程,稱為閉包
    scala scala> val more=1 scala> def add(x:Int)={x+more} // 函數內部沒有給出more的定義,而是根據上文的more=1推斷而來 scala> add(1) res0: Int = 2

  2. 閉包的高級形式:匿名函數中包含第二個綁定變量
    ```scala
    scala> def add(more:Int)={(x:Int)=>x+more} // add函數內部有2個參數,卻只有一個參數列表

    scala> val add1=add(1) // 此時add1的變量個數和參數列表個數相同
    add1: Int => Int =

    scala> add1(2)
    res2: Int = 3
    ```

四.柯里化

  1. 柯里化:
    柯里化是一種函數的書寫格式,他把多參函數,轉化為擁有一個參數的函數
    柯里化將單個參數單拎出來,以構建用于類型推斷的函數
    eg:閉包中的def add(more:Int)={(x:Int)=>x+more},add函數實際上有2個參數,more和x
    ```scala
    scala> def add(x:Int,y:Int)=x+y // 2參函數的一般形式

    scala> def add(x:Int)=(y:Int)=>x+y // 柯里化后的1參函數
    add: (x: Int)Int => Int

    scala> add(1) // 類型推斷后,add(1)=(y:Int)=>1+y
    res5: Int => Int =

    scala> add(1)(2)
    res6: Int = 3
    柯里化簡寫形式scala
    scala> def add(x:Int)(y:Int)=x+y
    add: (x: Int)(y: Int)Int

    scala> add(1)(2) //add(1)(2)的調用,先轉化為add(1)函數,再給這個函數傳參2
    res7: Int = 3
    ```

五.控制抽象

  1. scala有一個函數級別的模板設計模式,為一個算法起一個別名,聲明返回值類型,在函數體內,用這些別名形成操作模板。調用這種模板函數時,可以將一系列語句組成用大括號擴起來形成函數語句塊,把語句塊作為參數傳進這個模板函數
    eg:用控制抽象實現while..until的語法:
    ```scala
    scala> def until(condition: =>Boolean)(fun: =>Unit){
    | if(!condition){
    | fun
    | until(condition)(fun)
    | }
    | }
    until: (condition: => Boolean)(fun: => Unit)Unit

    scala> a=5
    scala> until{a==1}{a-=1
    | println(a)
    | }
    4
    3
    2
    1

    ```

轉載于:https://www.cnblogs.com/72808ljup/p/5376519.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線程和進程的區別?

進程是操作系統分配資源的最小單元&#xff0c;線程是操作系統調度的最小單元。 一個程序至少有一個進程,一個進程至少有一個線程。

收集12個經典的程序員段子

1bug 跟蚊子的相似之處&#xff1a;1、不知道藏在哪里。2、不知道有多少。3、總是在你即將睡覺休息的時候出現。2A&#xff1a;最近在看《一拳超人》&#xff0c;覺得咱們程序猿跟埼玉老師有點像啊&#xff01;B&#xff1a;哪里像了&#xff1f;A&#xff1a;越禿越強&#xf…

2020mysql安裝教程_2020MySQL安裝圖文教程

MySQL安裝圖文教程(Windows10)1、MySQL下載可以去MySQL官網下載&#xff0c;或者在我提供的百度云鏈接下載。官網下載網速較慢&#xff0c;我從官網下載了將近四個小時&#xff0c;然后把下載好的放在了百度網盤&#xff0c;需要的而已自取。MySQL官網地址&#xff1a;MySQL官網…

說一下 runnable 和 callable 有什么區別?

主要區別 Runnable 接口 run 方法無返回值&#xff1b;Callable 接口 call 方法有返回值&#xff0c;支持泛型Runnable 接口 run 方法只能拋出運行時異常&#xff0c;且無法捕獲處理&#xff1b;Callable 接口 call 方法允許拋出異常&#xff0c;可以獲取異常信息 Runnable Ca…

幾種常見的光纖接頭(ST,SC,LC,FC)以及PC、APC和UPC的區別

一、幾種常見的光纖接頭(ST,SC,LC,FC)FC型光纖連接器&#xff1a;外部加強方式是采用金屬套&#xff0c;緊固方式為螺絲扣。 一般在ODF側采用(配線架上用的最多)SC型光纖連接器&#xff1a;連接GBIC光模塊或普通光纖收發器的連接器&#xff0c;它的外殼呈矩形&#xff0c;緊固方…

nginx配置ssl

1.使用pfx證書配置ssl &#xff08;http://www.heartlifes.com/archives/12/&#xff09; 。上傳證書 。生成證書crt及key文件 openssl pkcs12 -in /usr/local/nginx/ssl/xxx.pfx -clcerts -nokeys -out /usr/local/nginx/ssl/xxx.crt openssl pkcs12 -in /usr/local/nginx/ssl…

python開發客戶端_python用700行代碼實現http客戶端

本文用python在TCP的基礎上實現一個HTTP客戶端, 該客戶端能夠復用TCP連接, 使用HTTP1.1協議.一. 創建HTTP請求HTTP是基于TCP連接的, 它的請求報文格式如下:因此, 我們只需要創建一個到服務器的TCP連接, 然后按照上面的格式寫好報文并發給服務器, 就實現了一個HTTP請求.1. HTTPC…

家里網線的接法和順序

對于網線&#xff0c;大伙都熟悉吧&#xff0c;它是電腦連接時必不可少的一種設備。但是許多網友卻和小編一樣&#xff0c;不知道如何連接網線&#xff0c;導致電腦無法上網&#xff0c;下面我們就來詳細介紹一下&#xff1a;如何接網線以及家里網線的接法和順序&#xff1f;希…

String str=Hello 與 String str=new String(“Hello”)一樣嗎?

為什么會輸出上邊的結果呢&#xff0c;String x "Hello" 的方式&#xff0c;Java 虛擬機會將其分配到常量池中&#xff0c;而常量池中沒有重復的元素&#xff0c;比如當執行“Hello”時&#xff0c;java虛擬機會先在常量池中檢索是否已經有“Hello”,如果有那么就將…

盤點程序員最喜歡的15個網站

程序員作為一個經常和互聯網打交道的人群&#xff0c;他們喜歡瀏覽哪些網站呢&#xff1f;不愛敲代碼的程序猿整理了以下網站供大家參考&#xff0c;排名不分先后&#xff1a; 0. Google https://google.com 這個不用多說了吧。 1.GitHub 開發者最最最重要的網站&#xff1a;h…

簡單的反射 把datatable 轉換成list對象

/// <summary>/// 把datatable 轉換成list對象/// </summary>/// <typeparam name"T"></typeparam>/// <param name"dt"></param>/// <returns></returns>public List<T> SelectsAll<T>(Data…

mysql 取 映射數據庫中_JAVA與數據庫MySQL相連接

JDBC(Java數據庫連接體系結構)&#xff1a;是Java實現數據庫訪問的應用程序編程接口&#xff0c;主要功能是管理存放在數據庫中的數據。通過接口對象&#xff0c;應用程序可以完成與數據庫的連接&#xff0c;執行SQL語句&#xff0c;從數據庫中獲取結果&#xff0c;獲取狀態以及…

抽象類必須要有抽象方法嗎?

答案是&#xff1a;不必須。 這個題目主要是考察對抽象類的理解。 說一下我個人的理解吧。 1.如果一個類使用了abstract關鍵字修飾&#xff0c;那么這個類就是一個抽象類。 2.抽象類可以沒有抽象方法 3.一個類如果包含抽象方法&#xff0c;那么這個類必須是抽象類&#xf…

python序列化和反序列化_Python 中 json 數據序列化和反序列化

1.Json 定義定義&#xff1a;JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。JSON 的數據格式其實就是 python 里面的字典格式&#xff0c;里面可以包含方括號括起來的數組&#xff0c;也就是python里面的列表。特點&#xff1a;簡潔和清晰的層次…

重寫navigationController的push方法后,出現卡頓現象

在使用navigation的pushViewController進行push的時候&#xff0c;兩個頁面間的動畫會出現卡頓一下再推出的效果&#xff0c;是因為iOS7 viewController背景顏色的問題&#xff0c;看到大神的博客上說&#xff1a;其實不是卡頓&#xff0c;是由于透明色顏色重疊后視覺上的問題&…

硬件:RS232基礎知識筆記

個人計算機上的通訊接口之一&#xff0c;由電子工業協會&#xff08;ElectronicIndustriesAssociation&#xff0c;EIA&#xff09;所制定的異步傳輸標準接口。通常RS-232接口以9個引腳&#xff08;DB-9&#xff09;或是25個引腳&#xff08;DB-25&#xff09;的型態出現&#…

普通類和抽象類有哪些區別?

抽象類不能被實例化抽象類可以有抽象方法&#xff0c;抽象方法只需申明&#xff0c;無需實現含有抽象方法的類必須申明為抽象類抽象類的子類必須實現抽象類中所有抽象方法&#xff0c;否則這個子類也是抽象類抽象方法不能被聲明為靜態static抽象方法不能用 private 修飾&#x…

正則表達式格式化日期

var str "2016年4月11日";str str.replace(/[\u5e74|\u6708]/g,"-").replace(/\u65e5/g,""); 轉載于:https://www.cnblogs.com/smght/p/5379514.html

硬件:RS422基礎知識筆記

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

mysql和php數據交互_php mysql交互

1.接受數據if($_POST){$uname trim($_POST[‘uname‘]);$pasd md5($_POST[‘pasd‘]);2.查詢數據庫$conn new mysqli(‘localhost‘,‘root‘,‘root‘,‘qiye‘);$sql "select * from admin where uname ‘$uname‘ and pasd ‘$pasd‘ ";$res $conn->que…