scala case 常用简写
case樣本序列
先看一段代碼
? ? val func1: Int => Int = {
? ? ? ? case x ?=> 1
? ? }
1
2
3
等號的右邊是{case x => 1},一對花括號包裹著一個case語句。這樣的用法看到過很多次,但是很少有資料解釋為什么可以這樣用。查閱過很多資料,最終在《programming in Scala》(scala編程:黃海旭,高宇翔譯)里出現(xiàn)過一段話。“樣本序列可以用在出現(xiàn)函數(shù)字面量的任何地方。實質上,樣本序列就是函數(shù)字面量,而且更普遍。函數(shù)字面量有一個入口點和參數(shù)列表,但是樣本序列可以有多個入口點,每個都有自己的參數(shù)列表。”這三句話總結起來有兩點:
樣本序列可以替代函數(shù)字面量使用
樣本序列和一般函數(shù)字面量的不同在于有多個入口點,每個入口點有自己獨立的參數(shù)列表
現(xiàn)在就可以解釋為什么在代碼中可以這樣使用了,首先 val func1: Int => Int 聲明了不可變變量要被賦值一個Int => Int 類型的函數(shù)字面量,所以{case x => 1}可以被賦值給func1。
這種用法在scala里十分常見。大家一定經常使用的函數(shù)如foreach():
? ? ? ? ?def foreach[U](f: A => U) { while (hasNext) f(next()) }
1
大家習慣性的使用方式是:
?? ??? ?Seq(1, 2, 3).foreach{case x => println(x)}
1
這是因為foreach要求使用一個A => U類型的函數(shù)字面量作為參數(shù),所有可以使用樣本序列{case x => println(x)}作為參數(shù)。而上面的代碼其實是一種縮寫,實際上應該是:
?? ??? ?Seq(1, 2, 3).foreach({case x => println(x)}) //比上面的代碼多了一對括號()
1
此外,如大家常用的操作,如map,reduce都可以用樣本序列替換函數(shù)字面量。
以上展示的都是單行樣本序列,然后還有多行樣本序列,原理都是一樣的。
一個問題?
scala中還有一個不常用的寫法:
? ? ? ? val func2: Int => Int = {
? ? ? ? ? ? x => 1
? ? ? ? }
1
2
3
這種寫法和上面的上面的寫法幾乎一模一樣,唯獨少量一個case,不知道是不是樣例類的一種簡寫。如果有知道的還請解釋一下。我個人覺得有可能是閉包.
之前留了一個疑問,現(xiàn)在對這個疑問做下解釋:
其實上面的例子很簡單,只是一直陷入思維慣性,覺得很高深。我們在scala里是可以直接定義匿名函數(shù)的,如:
現(xiàn)在我們考慮給這個匿名函數(shù)賦給一個值:
?? ?val func2 = (x:Int) => 1+x
1
然后大家應該記得scala的代碼塊,就是花括號連同它包裹的地方是有值得,他的值就是最后一句代碼所標識的值,那{(x:Int) => 1+x}的值就是(x:Int) => 1+x,那么上一句代碼就可以表示為:
?? ?val func2 = {
?? ??? ??? ?(x:Int) => 1+x
?? ?}
1
2
3
然后只需要聲明一下fun2的類型:
? ? ? ? def func2:Int => Int = {
? ? ? ? ? ? (x:Int) => 1+x?
? ? ? ? }
1
2
3
然后做一下縮寫,如去掉花貨號里的()和x的數(shù)據(jù)類型聲明:
? ? ? ? def func2:Int => Int = {
? ? ? ? ? ? x: => 1+x
? ? ? ? }
1
2
3
現(xiàn)在就得到了最初的形式。為了進一步驗證正確性,可以嘗試在花括號里加一些代碼,發(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)這樣也是可行的,按理說這樣應該不可以,因為代碼塊的最后一句是一個z代碼的是一個Int類型,并不是 Int => Int類型的函數(shù)字面量。這是因為上面呢的代碼產生了視覺誤差,實際上應該是下面這樣的。
? ? ? ? def func2: Int => Int = {
? ? ? ? ? ? val y = 10
? ? ? ? ? ? x =>1 + x + y
? ? ? ? ? ? ? ? val z = 0
? ? ? ? ? ? ? ? z
? ? ? ? }
最后兩句代碼是屬于Int=>Int這個方法的方法體的
? ? ? ? ? ? x =>{1 + x + y
? ? ? ? ? ? ? ? val z = 0
? ? ? ? ? ? ? ? z}
1
2
3
4
5
6
7
8
9
10
然后嘗試把最后兩句代碼從里面的函數(shù)的方法體里取出來,就會報錯:
? ? ? ? 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
---------------------?
作者:齊夢星空?
來源:CSDN?
原文:https://blog.csdn.net/weixin_37275456/article/details/89672756?
版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的scala case 常用简写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指纹识别零日攻击的仿真器
- 下一篇: 基于Linux IIO接口的波形采集