1. 程式人生 > >Scala學習筆記(12)—— scala 高階特性

Scala學習筆記(12)—— scala 高階特性

1 高階函式

Scala混合了面向物件和函式式的特性,通常將可以做為引數傳遞到方法中的表示式叫做函式。在函數語言程式設計語言中,函式是“頭等公民”,高階函式包含:作為值的函式、匿名函式、閉包、柯里化等等。

1.1 作為值的函式

可以像任何其他資料型別一樣被傳遞和操作的函式,每當你想要給演算法傳入具體動作時這個特性就會變得非常有用。

定義函式時格式:val 變數名 = (輸入引數型別和個數) => 函式實現和返回值型別和個數
“=”表示將函式賦給一個變數
“=>”左面表示輸入引數名稱、型別和個數,右邊表示函式的實現和返回值型別和引數個數

scala> val arr= Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val fun = (x : Int) => x * 2
fun: Int => Int = <function1>

scala> arr.map(fun)
res0: Array[Int] = Array(2, 4, 6, 8, 10)

1.2 匿名函式

在Scala中,你不需要給每一個函式命名,沒有將函式賦給變數的函式叫做匿名函式

scala> arr.map((x : Int) => x *3)
res1: Array[Int] = Array(3, 6, 9, 12, 15)

由於Scala可以自動推斷出引數的型別,所以可以寫的更加精簡一些

scala> arr.map(x => x * 2)
res2: Array[Int] = Array(2, 4, 6, 8, 10)

終極方式

scala> arr.map(_ * 2)
res3: Array[Int] = Array(2, 4, 6, 8, 10)

1.3 將方法轉換成函式

在Scala中,方法和函式是不一樣的,最本質的區別是函式可以做為引數傳遞到方法中

scala> def m(x : Int) = x*3
m: (x: Int)Int

scala> val f = m _
f: Int => Int = <function1>

1.4 柯里化

柯里化指的是將原來接受兩個引數的方法變成新的接受一個引數的方法的過程。 在這裡插入圖片描述

package demo5

object FunDemo {
  def main(args: Array[String]): Unit = {
    def f2(x: Int)
= x * 2 val f3 = (x: Int) => x * 3 val f4: (Int) => Int = { x => x * 4 } val f4a: (Int) => Int = _ * 4 val f5 = (_: Int) * 5 val list = List(1, 2, 3, 4, 5) var new_list: List[Int] = null //第一種,最直觀的方式 (Int)=> Int //new_list = list.map((x:Int) => x*3) //第二種,由於map方法知道你會傳入一個型別為(Int)=> Int的函式,可以簡寫為 //new_list = list.map((x) => x*3) //第三種,對於只有一個引數的函式,可以省略引數外圍的() //new_list = list.map(x => x*3) //第四種,(終極方式) 如果引數在 => 的右側只出現一次,可以使用 new_list = list.map(_ * 3) //new_list.foreach(println()) var a = Array(1,2,3,4) a.map(_ * 3) } }

2 隱式轉換和隱式引數

隱式轉換和隱式引數是Scala中兩個非常強大的功能,利用隱式轉換和隱式引數,你可以提供優雅的類庫,對類庫的使用者隱匿掉那些枯燥乏味的細節。 隱式的對類的方法進行增強,豐富現有類庫的功能

2.1 例子

package cn.tzb.implict

//所有的隱式值和隱式方法必須放到object
object Context{
  implicit val a = "john"
}

object ImplictValue {

  def sayHi()(implicit name: String="Mike"): Unit ={
    println(s"Hi ! $name")

  }

  def main(args: Array[String]): Unit = {
    import Context._
    sayHi()
  }
}

Hi ! john

2.2 例子2

package cn.tzb.implict

import java.io.File
import scala.io.Source

object MyPredef {
  implicit def fileToRichFile(f: File) = new RichFile(f)
}

class RichFile(f: File) {
  def read() = Source.fromFile(f).mkString
}

object RichFile {
  def main(args: Array[String]): Unit = {
    val f = new File("d://words1.txt")

    //裝飾,顯示的增強
    //val contents = new RichFile(f).read()

    import MyPredef.fileToRichFile
    val contents = f.read
    println(contents)
  }
}

hello tom
hello jerry
hello henny
hello tom