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