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

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

3. apply 方法

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

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

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

4. option 類型

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

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ù)

被包在花括號(hào)內(nèi)沒(méi)有 match 的一組 case 語(yǔ)句是一個(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 高級(jí)特性

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ù),神奇的下劃線又出場(chǎng)了

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

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

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

2.1.3 柯里化

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

例子:

object Kelihua {

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

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

    //柯里化如果沒(méi)有第二個(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 作用

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

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. 下面要對(duì) 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. 定義隱式方法,用來(lái)將 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. 測(cè)試成功
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ù)來(lái)實(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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容