日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

寫在前面: 我是「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] = 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對于協(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方法

var _name: String = _
  • 當需要自定義時.自己重寫的get /set 方法

class Person {

private[this] var _name: String = _

def name: String = _name

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

}
  • 加注解自動生成兼容java的get/set方法

@BeanProperty var name: Int = _

九:單例對象:

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

十:伴生對象:

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

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

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

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

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