您好,登錄后才能下訂單哦!
今天小編給大家分享一下scala匿名函數案例分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
@1.說明
沒有名字的函數就是匿名函數。
(x:Int)=>{函數體}
x:表示輸入參數類型;Int:表示輸入參數類型;函數體:表示具體代碼邏輯
@2.傳遞匿名函數至簡原則:
(1)參數的類型可以省略,會根據形參進行自動的推導
(2)類型省略之后,發現只有一個參數,則圓括號可以省略;其他情
況:沒有參數和參數超過 1 的永遠不能省略圓括號。
(3)匿名函數如果只有一行,則大括號也可以省略
(4)如果參數只出現一次,則參數省略且后面參數可以用_代替
小編在此將代碼分為:“第一層”和“第二層”,方便大家理解:
和匿名函數的相愛相殺, 各位看官,正片開始。
-slaca第一層
//需求:傳遞的函數有兩個參數 //函數含義:傳遞兩個數,并對兩個數進行相加的邏輯操作 def calculator(a: Int, b: Int, sum: (Int, Int) => Int): Int = { sum(a, b) }
【函數具體解析】——小編提示:一定要先看懂3.2再看后面
@3.1 首先定義一個函數:參數包含 “數據” 和 “邏輯函數”
@3.2 第一層的時候 只需要聲名《“數據”的類型》 或《 “邏輯函數”的參數
類型和返回值類型,
1.(a: Int, b: Int) ------------------->數據的類型
2.(sum: (Int, Int) => Int)--------->邏輯函數的參數類型和返回值類型
3.sum(a, b):比較復雜,喝口水再來看,乖!但是記住:是水不是口水!
3.1:首先 “傳遞匿名函數”中的 邏輯是對數據的操作
3.2:那么可以理解為“傳遞匿名函數” 的數據就是為邏輯準備的
3.3 :所以邏輯函數就得包含數據,就有了(x:Int)=>{函數體} 中函數體包
含sum(a, b),這樣才能進行 對數據的邏輯操作
退一萬步來講,邏輯跟尼瑪數據分開,還操作個錘子
所以sum(a, b) ->第一層的最后操作:邏輯與數據的結合(跟那愛情一樣是
吧。聽懂掌聲,為愛鼓掌)就在這完成了。
@3.3 第二層的時候 才傳遞 《數據----->真實的數據》 《邏輯函數----->真
正的邏輯》
小編也在此將代碼分為:“第一層”和“第二層”,方便大家理解:
@4.1 Java第一層
Java是先聲明一個方法:也以傳遞兩個數字,并進行相加 為例
public static int add(int a,int b){ return a+b; }
1(int:a,int:b)----> 參數
2 a+b---->方法體 :此處也是省了類型,因為參數已經聲明過了
@4.2java第二層
等到調用時,才傳遞數據
add(2,3);
1.add(1,2) —> 此處省了邏輯,因為方法體中聲明過
2.想必看到這兒,大家已經有了心中的小九九,接下來大家跟小編一起看
看最后的思路吧
// (1)標準函數調用 println(calculator(2, 3, (x: Int, y: Int) => {x + y})) // (2)如果只有一行,則大括號也可以省略 println(calculator(2, 3, (x: Int, y: Int) => x + y)) // (3)參數的類型可以省略,會根據形參進行自動的推導; println(calculator(2, 3, (x , y) => x + y)) // (4)如果參數只出現一次,則參數省略且后面參數可以用_代替 println(calculator(2, 3, _ + _))
想必看到這兒,各位看官的思緒就像…那句話咋說來著,忘求了。讓我百度下下
瑪德,搜了半天沒搜到,略過…略過…
小編提示:沒有思緒的可以在看兩遍,琢磨琢磨!!!
正片開始:不是蒼老師哦!
scala第二層:
1.數據---->真正的數據
2.邏輯---->真正的邏輯
3.第一層的 sum(a, b)已經完成了邏輯包含數據的操作,當第二層傳遞完數
據,這部分就真正的完成了。剩下的就是看邏輯怎么對數據進行操作
3.1 x: Int, y: Int) => x + y ---->(x , y) => x + y 省類型:會根據形參進行自動的推導。沒什么獨特的,java也是一樣的:(參數有類型,方法體中省了的)
3.2 a: Int, b: Int—>2, 3 結合Scala 一二層的參數看
int a,int b-------->2,3 結合Java 一二層的參數看
從這兒我們可以看出 只要知道參數的名,和類型 即可 直接給值
3.3 (Int, Int) => Int----->_ + _ 單從這兒和3.2可以理解為 把參數名寫為"_"可能是scala的一個特色嘛,因為從3.2得知 需要參數名和類型,才能直接給值嘛。
3.4 但是我們在 第一層的函數塊中寫的是 sum(a,b)這里省了類型,因為可以從參數a: Int, b: Int得到參數名的類型,所以我們的"+"是基于 sum(a,b) 做的推斷,此時參數名,參數類型都有了,就可以直接傳值了,但是說白了,這個參數名是固定的,再怎么給值,也不能變。所以scala為了簡寫,就用“_”代替了
以上文章僅小編個人見解,如有錯誤,請大家暢所欲言。請各位dai佬諒解
<小編也只學了十來天scala,所以有很多不足的地方,請指出,謝謝大家了
同時小編寫的不易,從八點開始寫,寫道12點,中間吃了個飯。也請大家
Scala提供了一個相對輕量級的語法來定義匿名函數。源代碼中的匿名函數稱為函數文字,在運行時,函數文字被實例化為稱為函數值的對象。Scala支持一級函數,函數可以用函數文字語法表達,即(x:Int)=> x + 1,該函數可以由一個叫作函數值的對象來表示。
沒有名字的函數就是匿名函數,可以通過函數表達式 來設置匿名函數。
匿名函數(也稱為 lambda)是作為參數傳遞給高階函數的代碼塊。 維基百科將 匿名函數 定義為“未綁定到標識符的函數定義”。
Scala 中定義匿名函數的語法很簡單,箭頭左邊是參數列表,右邊是函數體。
使用匿名函數后,我們的代碼變得更簡潔了。
下面的表達式就定義了一個接受一個 Double 類型輸入參數的匿名函數:
val triple = (x:Double) => 3*x println(triple(3))
說明:
(x:Double) => 3 * x 就是匿名函數
(x:Double) 是形參列表,=> 是規定語法表示后面是函數體,3 * x 就是函數體,如果有多行,可以 {} 換行寫。
triple 是指向匿名函數的變量。
一旦你熟悉了 Scala,你就會一直使用這種形式來編寫匿名函數,這些函數在函數的一個位置使用一個變量。 但如果你愿意,你也可以用更長的形式來寫它們
val doubledInts = ints.map((i: Int) => i * 2)
因為 Scala 編譯器可以從 ints 中的數據推斷 i 是一個 Int,所以可以刪除 Int 聲明:
val doubledInts = ints.map((i) => i * 2)
因為只有一個參數,所以不需要在參數 i 周圍的括號:
val doubledInts = ints.map(i => i * 2)
因為當參數在函數中只出現一次時,Scala 允許您使用 _ 符號而不是變量名,所以代碼可以進一步簡化:
val doubledInts = ints.map(_ * 2)
請編寫一個匿名函數,可以返回2個整數的和,并輸出該匿名函數的類型。
val f1 = (n1: Int, n2: Int ) => { println("匿名函數被調用") n1 + n2 } println("f1類型=" + f1) println(f1(10, 30))
以上就是“scala匿名函數案例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。