成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...
寫在前面: 我是「nicedays」,一枚喜愛做特效,聽音樂,分享技術(shù)的大數(shù)據(jù)開發(fā)猿。這名字是來自world order樂隊的一首HAVE A NICE DAY。如今,走到現(xiàn)在很多坎坷和不順,如今終于明白nice day是需要自己賦予的。白駒過隙,時光荏苒,珍惜當下~~
寫博客一方面是對自己學習的一點點總結(jié)及記錄,另一方面則是希望能夠幫助更多對大數(shù)據(jù)感興趣的朋友。如果你也對 大數(shù)據(jù)與機器學習感興趣,可以關(guān)注我的動態(tài) https://blog.csdn.net/qq_35050438,讓我們一起挖掘數(shù)據(jù)與人工智能的價值~
文章目錄
Scala特性:
函數(shù)式編程:
一:懶值:
二:閉包(closure):
三:柯里化:
四:隱式參數(shù):
五:隱式轉(zhuǎn)換:
六:_常用場景:
七:偏函數(shù):
OOP式編程:
一:類:
二:內(nèi)部類:
三:樣例類(case class)--實體類
四:枚舉類:
五:泛型類:
六:類型邊界:
類型上界:
類型下界:
七:型變:
八:get/set:
九:單例對象:
十:伴生對象:
十一:trait特征--接口+抽象類
十二:動態(tài)混入:
十三:scala創(chuàng)建對象有幾種方式:
十四:疊加特質(zhì):
十五:擴展特質(zhì):
? ?Scala特性:
函數(shù)式編程:
一:懶值:
初始化推遲,第一次調(diào)用變量時才會被初始化
// lazy val word = scala.id.Source.fromFile("").mkString解決初始化開銷很大的語句
二:閉包(closure):
肉眼看到效果: 在函數(shù)內(nèi)部可以訪問到函數(shù)體外的變量或者是其他函數(shù)的變量
實際操作: 將函數(shù)能訪問的變量(如果這個變量是其他函數(shù)的,它會復(fù)制一份出來)和這個函數(shù)都封裝成了只有一個方法的對象
最后導(dǎo)致效果: 看上去讓兩個函數(shù)都可以擁有相同的變量名,但是操作變量時,雙方互不影響
三:柯里化:
把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)
其實這很好理解,柯里化的本質(zhì)就是揭示了任何函數(shù)哪怕是多參數(shù)的,都可以轉(zhuǎn)化成單參數(shù)的函數(shù)疊加。
def定義柯里化方法
# 實現(xiàn)過程def mulOne(x: Int) = { (y: Int) => x * y }
def mulOne(x: Int) = (y: Int) => x * y
def mulOne(x: Int)(y: Int) = x * y//方法類型 mulOne: (x: Int)(y: Int) Int
val定義函數(shù)時
// val 可以定義匿名函數(shù),這下面相當于嵌套了兩層匿名函數(shù)val mulOne = (x: Int) => (y: Int) => x * y// 函數(shù)類型:Int => (Int => Int)四:隱式參數(shù):
標記一個implicit的參數(shù)列表
def sum(score: Int)(implicit y:Int): Int五:隱式轉(zhuǎn)換:
隱式轉(zhuǎn)換觸發(fā)機制:
當表達式的類型與預(yù)期的類型不同時
當對象訪問一個不存在的成員
當對象調(diào)用某個方法,而方法的參數(shù)聲明與傳入?yún)?shù)不匹配時
六:_常用場景:
模式匹配
導(dǎo)包中的所有類
函數(shù)賦值
// medef fun = {
println("call")
}
val v = fun // 調(diào)用函數(shù)funval f = fun _ // 將函數(shù)fun賦值給f
七:偏函數(shù):
在對符合某個條件,而不是所有情況進行邏輯操作時,使用偏函數(shù)是一個不錯的選擇。
將包在大括號內(nèi)的一組case語句封裝為函數(shù),我們稱為偏函數(shù)
偏函數(shù)是一個特質(zhì)PatrialFunction
具體形式:
val fun1 = new PartialFunction[Any: Int] { // 當返回真,就去調(diào)用apply,構(gòu)建對象實例,假就不調(diào)用override def isDefinedAt(x: Any) = {
println("x=" + x)
x.isInstanceOf[Int]
}
override def apply(v1: Any) = {
v1.asInstanceOf[Int] + 1
}
}
簡寫形式:
val fun1: PartialFunction[Any: Int] { case i: Int => i + 1}// 再簡化val list3 = list.collect{case i: Int => i + 1}// 寫多行也沒有問題collect調(diào)用:
list.collect(fun1)OOP式編程:
一:類:
scala 類中無法定義靜態(tài)成員變量和方法
構(gòu)造器
主構(gòu)造器
輔助構(gòu)造器
成員變量與方法
類的實例化
二:內(nèi)部類:
一個類可以作為另一個類的成員
java內(nèi)部類是外部類的成員
scala內(nèi)部類綁定到外部類的對象實例
給自己用的,用來新建對象
三:樣例類(case class)—實體類
用于描述不可變的值對象
樣例類構(gòu)造參數(shù)為val,自動實現(xiàn)類構(gòu)造參數(shù)的getter
樣例類構(gòu)造參數(shù)為var,自動實現(xiàn)類構(gòu)造參數(shù)的setter和getter
自動創(chuàng)建伴生對象
自動實現(xiàn)其他方法
toString,equals,copy, hashcode,
伴生對象的apply和unapply
四:枚舉類:
object Weekday extends Enumeration { //枚舉值從0開始計數(shù)val Mon,Tue,Wed,Thu,Fri,Sat,Sun=Value
}
五:泛型類:
泛型類指可以接受類型參數(shù)的類,泛型類在集合類中被廣泛使用
class Stack[T] { var elements: List[T] = Nildef push(x: T) { elements = x :: elements }
def top: T = elements.head
def pop() { var t = elements.head
elements = elements.tail
t
}
def showElements(){
elements.foreach(x=>print(s"$x "));println()}
}
六:類型邊界:
類型上界:
T<:a>子類
類型下界:
T>:A 表示類型變量T應(yīng)該是類型A的超類
七:型變:
java對于協(xié)變的一致性問題可以用 ?? extends T ?來解決
協(xié)變 類似于<:>
對于兩種類型 A 和 B,如果 A 是 B 的子類型,那么 Foo[A] 就是 Foo[B] 的子類型
class Foo[+T] // 協(xié)變類逆變
對于兩種類型 A 和 B,如果 A 是 B 的子類型,那么 Bar[B] 就是 Bar[A] 的子類型
class Bar[-T] // 逆變類不變
默認情況下,Scala中的泛型類是不變的
class Baz[+T] //不協(xié)變類
八:get/set:
scala自動生成get/set方法
當需要自定義時.自己重寫的get /set 方法
private[this] var _name: String = _
def name: String = _name
def name_=(value: String): Unit = _name = value
}
加注解自動生成兼容java的get/set方法
九:單例對象:
scala類中無法定義靜態(tài)成員,object來表示靜態(tài)成員和方法
十:伴生對象:
當你的類需要用到你的對象時,即用到既有實例方法又有靜態(tài)方法的類.通常我們使用伴生對象完成
伴生類與伴生對象可互相訪問各自私有成員
伴生對象可為伴生類增加靜態(tài)成員
val id = Account.newUniqueNumber()
}// 伴生對象object Account { // 用伴生對象來代替new
def apply(n: Int): Account = new Account(n: Int);
private var lastNumber = 0
private def newUniqueNumber = lastNumber += 1}// apply方法名默認可以不用寫Account(5)
十一:trait特征—接口+抽象類
多個類具有相同的特征1時,就可以將這個特征獨立出來,采用關(guān)鍵字trait來聲明。
java中的接口都可以當作特質(zhì)來使用。
特質(zhì)本質(zhì)還是用了java的抽象類來完成了方法的具體實現(xiàn),在反編譯過程中會發(fā)現(xiàn),特質(zhì)會去生成一個【特質(zhì)名$class.class】的一個抽象類和一個【特質(zhì)名】的接口,抽象類會去實現(xiàn)該接口的方法,
十二:動態(tài)混入:
b和c如果 ? ?都應(yīng)用了某特質(zhì),b去實現(xiàn)了該特質(zhì)的某種方法,c并不會收到影響,完成了解耦而java接口會因為傳遞性,c會有b實現(xiàn)的方法。
var xxx = new Operate with OperateTrait// 構(gòu)建對象時混入的特質(zhì),對象可以使用特質(zhì)的方法十三:scala創(chuàng)建對象有幾種方式:
new 對象
apply 創(chuàng)建
匿名子類方式
動態(tài)混入
十四:疊加特質(zhì):
構(gòu)建對象的同時混入多個特質(zhì),稱為疊加特質(zhì)
那么特質(zhì)聲明順序從左到右,方法執(zhí)行順序從右到左
菱形結(jié)構(gòu)相同父類
十五:擴展特質(zhì):
特質(zhì)繼承類來擴展實現(xiàn)一些類的功能
總結(jié)
以上是生活随笔為你收集整理的成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 板材开料最优算法_板材套料软件AutoN
- 下一篇: 划痕麻点检测程序_精密外观检测机设计