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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

scala case 常用简写

發(fā)布時(shí)間:2024/3/13 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scala case 常用简写 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

case樣本序列
先看一段代碼

? ? val func1: Int => Int = {
? ? ? ? case x ?=> 1
? ? }
1
2
3
等號(hào)的右邊是{case x => 1},一對(duì)花括號(hào)包裹著一個(gè)case語(yǔ)句。這樣的用法看到過(guò)很多次,但是很少有資料解釋為什么可以這樣用。查閱過(guò)很多資料,最終在《programming in Scala》(scala編程:黃海旭,高宇翔譯)里出現(xiàn)過(guò)一段話(huà)。“樣本序列可以用在出現(xiàn)函數(shù)字面量的任何地方。實(shí)質(zhì)上,樣本序列就是函數(shù)字面量,而且更普遍。函數(shù)字面量有一個(gè)入口點(diǎn)和參數(shù)列表,但是樣本序列可以有多個(gè)入口點(diǎn),每個(gè)都有自己的參數(shù)列表。”這三句話(huà)總結(jié)起來(lái)有兩點(diǎn):

樣本序列可以替代函數(shù)字面量使用
樣本序列和一般函數(shù)字面量的不同在于有多個(gè)入口點(diǎn),每個(gè)入口點(diǎn)有自己獨(dú)立的參數(shù)列表
現(xiàn)在就可以解釋為什么在代碼中可以這樣使用了,首先 val func1: Int => Int 聲明了不可變變量要被賦值一個(gè)Int => Int 類(lèi)型的函數(shù)字面量,所以{case x => 1}可以被賦值給func1。
這種用法在scala里十分常見(jiàn)。大家一定經(jīng)常使用的函數(shù)如foreach():

? ? ? ? ?def foreach[U](f: A => U) { while (hasNext) f(next()) }
1
大家習(xí)慣性的使用方式是:

?? ??? ?Seq(1, 2, 3).foreach{case x => println(x)}
1
這是因?yàn)閒oreach要求使用一個(gè)A => U類(lèi)型的函數(shù)字面量作為參數(shù),所有可以使用樣本序列{case x => println(x)}作為參數(shù)。而上面的代碼其實(shí)是一種縮寫(xiě),實(shí)際上應(yīng)該是:

?? ??? ?Seq(1, 2, 3).foreach({case x => println(x)}) //比上面的代碼多了一對(duì)括號(hào)()
1
此外,如大家常用的操作,如map,reduce都可以用樣本序列替換函數(shù)字面量。
以上展示的都是單行樣本序列,然后還有多行樣本序列,原理都是一樣的。

一個(gè)問(wèn)題?
scala中還有一個(gè)不常用的寫(xiě)法:

? ? ? ? val func2: Int => Int = {
? ? ? ? ? ? x => 1
? ? ? ? }
1
2
3
這種寫(xiě)法和上面的上面的寫(xiě)法幾乎一模一樣,唯獨(dú)少量一個(gè)case,不知道是不是樣例類(lèi)的一種簡(jiǎn)寫(xiě)。如果有知道的還請(qǐng)解釋一下。我個(gè)人覺(jué)得有可能是閉包.

之前留了一個(gè)疑問(wèn),現(xiàn)在對(duì)這個(gè)疑問(wèn)做下解釋:
其實(shí)上面的例子很簡(jiǎn)單,只是一直陷入思維慣性,覺(jué)得很高深。我們?cè)趕cala里是可以直接定義匿名函數(shù)的,如:


現(xiàn)在我們考慮給這個(gè)匿名函數(shù)賦給一個(gè)值:

?? ?val func2 = (x:Int) => 1+x
1
然后大家應(yīng)該記得scala的代碼塊,就是花括號(hào)連同它包裹的地方是有值得,他的值就是最后一句代碼所標(biāo)識(shí)的值,那{(x:Int) => 1+x}的值就是(x:Int) => 1+x,那么上一句代碼就可以表示為:

?? ?val func2 = {
?? ??? ??? ?(x:Int) => 1+x
?? ?}
1
2
3
然后只需要聲明一下fun2的類(lèi)型:

? ? ? ? def func2:Int => Int = {
? ? ? ? ? ? (x:Int) => 1+x?
? ? ? ? }
1
2
3
然后做一下縮寫(xiě),如去掉花貨號(hào)里的()和x的數(shù)據(jù)類(lèi)型聲明:

? ? ? ? def func2:Int => Int = {
? ? ? ? ? ? x: => 1+x
? ? ? ? }
1
2
3
現(xiàn)在就得到了最初的形式。為了進(jìn)一步驗(yàn)證正確性,可以嘗試在花括號(hào)里加一些代碼,發(fā)現(xiàn)也是可行的。

? ? ? ? def func2: Int => Int = {
? ? ? ? ? ? val y = 10
? ? ? ? ? ? x: => 1 + x + y
? ? ? ? }
1
2
3
4
然后我們嘗試在代碼塊的最后加一些代碼:

? ? ? ? def func2: Int => Int = {
? ? ? ? ? ? val y = 10
? ? ? ? ? ? x => 1 + x + y
? ? ? ? ? ? val z = 0
? ? ? ? ? ? z
? ? ? ? }
1
2
3
4
5
6
發(fā)現(xiàn)這樣也是可行的,按理說(shuō)這樣應(yīng)該不可以,因?yàn)榇a塊的最后一句是一個(gè)z代碼的是一個(gè)Int類(lèi)型,并不是 Int => Int類(lèi)型的函數(shù)字面量。這是因?yàn)樯厦婺氐拇a產(chǎn)生了視覺(jué)誤差,實(shí)際上應(yīng)該是下面這樣的。

? ? ? ? def func2: Int => Int = {
? ? ? ? ? ? val y = 10
? ? ? ? ? ? x =>1 + x + y
? ? ? ? ? ? ? ? val z = 0
? ? ? ? ? ? ? ? z
? ? ? ? }
最后兩句代碼是屬于Int=>Int這個(gè)方法的方法體的
? ? ? ? ? ? x =>{1 + x + y
? ? ? ? ? ? ? ? val z = 0
? ? ? ? ? ? ? ? z}
1
2
3
4
5
6
7
8
9
10
然后嘗試把最后兩句代碼從里面的函數(shù)的方法體里取出來(lái),就會(huì)報(bào)錯(cuò):

? ? ? ? def func2: Int => Int = {
? ? ? ? ? ? val y = 10
? ? ? ? ? ? { x => 1 + x + y }
? ? ? ? ? ? val z = 0
? ? ? ? ? ? z
? ? ? ? }
1
2
3
4
5
6
Error:(9, 13) type mismatch;
found : Int
required: Int => Int
z
---------------------?
作者:齊夢(mèng)星空?
來(lái)源:CSDN?
原文:https://blog.csdn.net/weixin_37275456/article/details/89672756?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的scala case 常用简写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。