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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...

發(fā)布時(shí)間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫在前面: 我是「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] = Nil
def 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方法

var _name: String = _
  • 當(dāng)需要自定義時(shí).自己重寫的get /set 方法

class Person {

private[this] var _name: String = _

def name: String = _name

def name_=(value: String): Unit = _name = value

}
  • 加注解自動(dòng)生成兼容java的get/set方法

@BeanProperty var name: Int = _

九:單例對(duì)象:

scala類中無法定義靜態(tài)成員,object來表示靜態(tài)成員和方法

十:伴生對(duì)象:

當(dāng)你的類需要用到你的對(duì)象時(shí),即用到既有實(shí)例方法又有靜態(tài)方法的類.通常我們使用伴生對(duì)象完成

  • 伴生類與伴生對(duì)象可互相訪問各自私有成員

  • 伴生對(duì)象可為伴生類增加靜態(tài)成員

// 伴生類class Account(n: Int) {
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)容,希望文章能夠幫你解決所遇到的問題。

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