Scala 學(xué)習(xí)筆記

一烛卧、Scala 基礎(chǔ)

  1. 變量
  1. 定義方法和函數(shù)

定義方法

def func(x: Int, y: Int) = x + y

定義函數(shù)

val fun = (x: Int, y: Int) => x + y

// 另外一種寫法
val fun: (Int, Int) => Int = (x: Int, y: Int) => x + y

3. apply 方法

通常我們會在類的伴生對象中定義apply方法,當(dāng)遇到類名(參數(shù)1,...參數(shù)n)時(shí)apply方法會被調(diào)用

object ApplyDemo {
  def main(args: Array[String]) {
    //調(diào)用了Array伴生對象的apply方法
    //def apply(x: Int, xs: Int*): Array[Int]
    //arr1中只有一個(gè)元素5
    val arr1 = Array(5)
    println(arr1.toBuffer)

    //new了一個(gè)長度為5的array肖方,數(shù)組里面包含5個(gè)null
    var arr2 = new Array(5)
  }
}

4. option 類型

在 Scala 中 Option 類型樣例類用來表示可能存在或也可能不存在的值(Option 的子類有 Some 和 None)冰悠。Some 包裝了某個(gè)值节槐,None 表示沒有值

package cn.itcast.cases

object OptionDemo {
  def main(args: Array[String]) {
    val map = Map("a" -> 1, "b" -> 2)
    val v = map.get("b") match {
      case Some(i) => i
      case None => 0
    }
    println(v)
    //更好的方式
    val v1 = map.getOrElse("c", 0)
    println(v1)
  }
}

5. 偏函數(shù)

被包在花括號內(nèi)沒有 match 的一組 case 語句是一個(gè)偏函數(shù)操灿,它是 PartialFunction[A, B] 的一個(gè)實(shí)例,A 代表參數(shù)類型趾盐,B 代表返回類型庶喜,常用作輸入模式匹配

package cn.itcast.cases

object PartialFuncDemo  {

  def func1: PartialFunction[String, Int] = {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }

  def func2(num: String) : Int = num match {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }

  def main(args: Array[String]) {
    println(func1("one"))
    println(func2("one"))
  }
}

二、scala 高級特性

2.1 高階函數(shù)

2.1.1 閉包

參考文章:https://www.cnblogs.com/moonandstar08/p/5240312.html

2.1.2 將方法轉(zhuǎn)換成函數(shù)

在 Scala 中救鲤,方法和函數(shù)是不一樣的久窟,最本質(zhì)的區(qū)別是函數(shù)可以做為參數(shù)傳遞到方法中
但是方法可以被轉(zhuǎn)換成函數(shù),神奇的下劃線又出場了

//定義一個(gè)方法
def method(x: nt) = x * 3

//神奇的下劃線將方法轉(zhuǎn)換成了函數(shù)
val fun = method _

//將函數(shù)傳入 map 中
arr.map(fun)

2.1.3 柯里化

柯里化指的是將原來接受兩個(gè)參數(shù)的方法變成新的接受一個(gè)參數(shù)的方法的過程

例子:

object Kelihua {

  def main(args: Array[String]): Unit = {

    val triple = mul(3)
    val half = mul(0.5)

    //柯里化如果沒有第二個(gè)參數(shù)本缠,就要用 _ 占位
//    val triple = mul2(3)(_)
//    val half = mul2(0.5)(_)
    println(triple(14) + " " + half(14))

    // 閉包也可以使用柯里化的方法調(diào)用
    println(mul(3)(14))

  }
  // scala 的閉包
  def mul(factor: Double) = (x: Double) => factor * x

  // 柯里化的定義方式
  def mul2(factor: Double)(x: Double) = factor * x
}

2.2 隱式轉(zhuǎn)換和隱式參數(shù)

2.2.1 作用

隱式的對類的方法進(jìn)行增強(qiáng)斥扛,豐富現(xiàn)有類庫的功能

2.2.2 隱式轉(zhuǎn)換函數(shù)

是指那種以implicit關(guān)鍵字聲明的帶有單個(gè)參數(shù)的函數(shù)

舉個(gè)例子

  1. 先定義一個(gè)類:
class Girl(val name: String, var faceValue: Int, var age: Int)
  1. 下面要對 Girl 類進(jìn)行增強(qiáng),使她具有排序的功能

做法一:使用視圖界定丹锹,ViewBound稀颁,需要傳入一個(gè)隱式的函數(shù)

class Choosen[T <% Ordered[T]] {

  def choose(x: T, y: T) = {
    if (x > y) x else y
  }
}
  1. 定義隱式方法,用來將 Girl 轉(zhuǎn)換成 Ordered[Girl]
object MyPreDef {

  // 隱式方法
  implicit def girlToOrdered(g: Girl) = new Ordered[Girl] {
    override def compare(that: Girl) = {
      if (g.faceValue == that.faceValue) {
        g.age - that.age
      } else {
        g.faceValue - that.faceValue
      }
    }
  }
}
  1. 測試成功
object Choosen {

  def main(args: Array[String]): Unit = {
    // 導(dǎo)入隱式轉(zhuǎn)換
    import MyPreDef._
    val ch = new Choosen[Girl]
    val g1 = new Girl("liuyan", 80, 23)
    val g2 = new Girl("JULIA", 100, 18)
    println(ch.choose(g1, g2).name)
  }
}

以上的例子還可以使用上下文界定實(shí)現(xiàn)卷仑,ContextBound峻村,需要傳入一個(gè)隱式的值

// 上下文界定
class Choosen[T : Ordering] {

  def select(x: T, y: T) = {
    val ord = implicitly[Ordering[T]]
    if(ord.gt(x, y)) x else y
  }
}

ContextBound 需要傳入一個(gè)隱式值

implicit val grilToOrdering = new Ordering[Girl]{
    override def compare(x: Girl, y: Girl) = {
      if (x.faceValue == y.faceValue) {
        x.age - y.age
      } else {
        x.faceValue - y.faceValue
      }
    }
}

抽象成公共方法麸折,并結(jié)合使用隱式參數(shù)來實(shí)現(xiàn)

class Choosen[T] {

  // 隱式參數(shù)锡凝,相當(dāng)于ViewBound 視圖界定
  def choose(x: T, y: T)(implicit ord: T => Ordered[T]) = {
    if (x > y) x else y
  }

  // 相當(dāng)于傳入一個(gè)隱式值,相當(dāng)于 ContextBound
  def select(x: T, y: T)(implicit ord : Ordering[T]) = {
    if (ord.gt(x, y)) x else y
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垢啼,一起剝皮案震驚了整個(gè)濱河市窜锯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芭析,老刑警劉巖锚扎,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馁启,居然都是意外死亡驾孔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門惯疙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翠勉,“玉大人,你說我怎么就攤上這事霉颠《月担” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵蒿偎,是天一觀的道長朽们。 經(jīng)常有香客問我怀读,道長,這世上最難降的妖魔是什么骑脱? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任菜枷,我火速辦了婚禮,結(jié)果婚禮上叁丧,老公的妹妹穿的比我還像新娘犁跪。我一直安慰自己,他們只是感情好歹袁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布坷衍。 她就那樣靜靜地躺著,像睡著了一般条舔。 火紅的嫁衣襯著肌膚如雪枫耳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天孟抗,我揣著相機(jī)與錄音迁杨,去河邊找鬼。 笑死凄硼,一個(gè)胖子當(dāng)著我的面吹牛铅协,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摊沉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼狐史,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了说墨?” 一聲冷哼從身側(cè)響起骏全,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尼斧,沒想到半個(gè)月后姜贡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棺棵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年楼咳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烛恤。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡母怜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棒动,到底是詐尸還是另有隱情糙申,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站柜裸,受9級特大地震影響缕陕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疙挺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一扛邑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铐然,春花似錦蔬崩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至自点,卻和暖如春桐罕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桂敛。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工功炮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人术唬。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓薪伏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粗仓。 傳聞我的和親對象是個(gè)殘疾皇子嫁怀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • scala學(xué)習(xí)筆記 第2章 變量和數(shù)據(jù)類型 基本數(shù)據(jù) scala的核心數(shù)據(jù)為四種 :字面量、值潦牛、變量眶掌、類型 值使...
    485b1aca799e閱讀 2,113評論 0 1
  • 大數(shù)據(jù)學(xué)院_騰訊大數(shù)據(jù)http://data.qq.com/academySpark是一個(gè)通用的并行計(jì)算框架挡育,立足...
    葡萄喃喃囈語閱讀 575評論 0 1
  • scala文檔 包含內(nèi)容 1基礎(chǔ) 2控制結(jié)構(gòu)和函數(shù) 3數(shù)組相關(guān)操作 4映射和元組 5類 6對象 7.包和引入(x)...
    zlcook閱讀 996評論 0 3
  • 很多人常常有這樣一種感覺巴碗,拼命去維護(hù)的自認(rèn)為正確的東西,在現(xiàn)實(shí)里卻不堪一擊即寒;努力去拼搏的自認(rèn)為正確的方向橡淆,到頭來卻...
    秦廣玲閱讀 1,004評論 2 7
  • 新建maven工程: 在第一次使用idea時(shí),如下圖選擇新建工程 如下圖母赵,選擇maven工程逸爵,sdk通過new,選...
    牛馬風(fēng)情閱讀 1,876評論 2 4