scala語言的特點:
- 集成了面向?qū)ο蠛秃瘮?shù)式編程
- 函數(shù)式編程是將計算機的運算視為函數(shù)運算
- 鏈?zhǔn)骄幊?/li>
Scala中的String是可變的還是不可變的
- 它的底層就是Java的String,所以是不可變的
什么是閉包
函數(shù)捕獲自由變量的,閉包=代碼+非局部變量
簡述隱式轉(zhuǎn)換的作用
當(dāng)我們引入第三方包,但是不能修改代碼時胸完∨鹕恚可以使用隱式轉(zhuǎn)換增加新的功能,類似與Java的裝飾器模式迂曲,必須保證當(dāng)前環(huán)境下只有能被識別
什么是柯里化
接受一個多參數(shù)的函數(shù)轉(zhuǎn)換為多個單參數(shù)的函數(shù)列表
作用:
- 簡化了主函數(shù)的復(fù)雜度
- 提高了主函數(shù)的自閉性
- 提高了主函數(shù)的抽象能力
Scala中特質(zhì)的調(diào)用鏈
從右到左靶橱,從下到上,如果中間有沒有調(diào)用super的路捧,調(diào)用鏈就停止在這里
Scala的協(xié)變关霸,逆變,非變
首先定義的一個Trait Q[T]{}
- 協(xié)變 : 如果 A 是B的子類杰扫,那么Q[A] 是 Q[B]的子類队寇,Q這樣定義Trait Q[+T]{}
- 逆變: 如果A是B的子類,那么Q[B]是Q[A]的子類章姓,Q這樣定義Trait Q[-T]{}
- 非變: 沒有任何從屬關(guān)系佳遣,Q這樣定義Trait Q[T]{}
Object的作用
- 伴生對象
- 作為工具類或者放置常量
- 高效共享單個不可變的實列
- 單例模式
trait(特質(zhì))和abstract class(抽象類)的區(qū)別?
trait 使用 extends with實現(xiàn)多繼承
trait中可以定義實例方法
trait可以有構(gòu)造函數(shù)凡伊,但只能是無參數(shù)的
trait可以直接使用with混入對象
trait可以繼承class
case class (樣本類)是什么零渐?
一種語法糖
默認(rèn)實現(xiàn)是伴生對象
默認(rèn)實現(xiàn)了apply,unapply,tostring,equals,copy,hashcode
可以使用==比較內(nèi)容
由于實現(xiàn)了apply方法,可以不使用new 關(guān)鍵字實例化
樣本類中的參數(shù)默認(rèn)是val關(guān)鍵字窗声,不可以修改
伴生對象是什么相恃?
它由在同一個源文件中同名的class,object組成。
object可以訪問class中的私有變量
不能private[this]變量
可以實現(xiàn)JAVA中的靜態(tài)變量的效果
類也可以訪問伴生對象中的私有方法
Scala類型系統(tǒng)中Nil, Null, None, Nothing四個類型的區(qū)別拦耐?
Nil表示空類型的List ,等同與List[Nothing]
Null是AnyRef的子類耕腾,由唯一的實例對象null
Nothing是所有類型的子類,沒有實例對象
None是Option的子類
尾遞歸
正常遞歸杀糯,每一次遞歸步驟扫俺,需要保存信息到堆棧里面,當(dāng)遞歸步驟很多時固翰,導(dǎo)致堆棧溢出狼纬。 尾遞歸就是為了解決上述問題,在尾遞歸中所有的計算都是在遞歸之前調(diào)用骂际, 編譯器可以利用這個屬性避免堆棧錯誤疗琉,尾遞歸的調(diào)用可以使信息不插入棧,從而優(yōu)化尾遞歸歉铝。 使用 @tailrec 標(biāo)簽可使編譯器強制使用尾遞歸盈简。
高階函數(shù)
高階函數(shù)指能接受或者返回其他函數(shù)的函數(shù),scala中的filter map flatMap函數(shù)都能接受其他函數(shù)作為參數(shù)