1. 程式人生 > >scala 奇淫巧技

scala 奇淫巧技

收集了下scala的自己遇到過的下劃線 _ 的使用場景

好像還有在泛型還是定界延續的時候用到,後續補充

1.初始化的時候

object Sample {

var name:String=_

def main (args: Array[String]){

name="hello world"

println(name)

    }

}

就相當於java的變數初始化

因為scala中不建議使用null,所以使用 _ 代替

2.引包的時候

import math._

等於

java math.*;

3.函式中使用

我的理解是

當一個數組或其他資料結構呼叫一個函式時

在函式的操作中只會對該陣列或其他資料結構的一類資料進行同一類操作時可以使用

_ 代替

(1 to 10).map(x => x * 2)

等於

(1 to 10).map(_ * 2)

還有在輸入需要2個引數的函式時

這時候 _ 會代替前一個元素與後一個元素

例如 reduce,sortWith

(1 to 10).reduce((x, y) => x + y)

等於

(1 to 10).reduce(_ + _)

val a = List(1,32,4,2,1,6)

a.sortWith(_ > _) // List(32, 6, 4, 2, 1, 1)

a.sortWith(_ < _) //List(1, 1, 2, 4, 6, 32)

等於

a.sortWith((x, y) => x > y) //List[Int] = List(32, 6, 4, 2, 1, 1)

最終根據函式簽名理解為

(f: (A, A) => A) 如果為一類資料型別操作時,可以使用 _ 代替

4.模式匹配中使用

a match {

    case "1" => "1"

    case "2" => "2"

    case Some(_) => "yes" //當匹配Options的時候,可以匹配Some是否有值

    case _ => "nonthing" //相當於匹配其他所有,if中的else

一樣

}

(1, "2") match {

    case (_, _) => "yes" //佔位符匹配

    case (_:Int, _:String) => "yes" //佔位符加資料型別匹配

    case _ => "nonthing"

}

5.偏函式,柯里化中用法

算是充當一個柯里化的佔位符吧,有時候在呼叫函式時,可能不會馬上宣告需要的變數,這時候可以使用下劃線先臨時佔位

def hello(p1:String, p2: Double): String = f"$p1, $p2%.2f"

val hh = hello("CDP", _: Double)

println(hh(1.231))

def hello1(a: Int)(b: Int) = a + b //hello1: (a: Int)(b: Int)Int

val h1 = hello1(2)_ // h1: Int => Int = <function1>

h1(8) // 10

6.型別序列使用

(1 to 5) //Range(1, 2, 3, 4, 5) 所有的直接使用to,都是Range資料型別

Seq(1 to 5: _*) //如果想生成指定型別的序列可以使用: _*方式 List(1, 2, 3, 4, 5)

Seq(1 to 5) //如果在宣告的時候沒有加,那這個型別就是 Seq(Range(***))型別

7.元組呼叫

val a = (1, "a")

a._1 // 1

a._2 // a

8.排序中的時候

val a = List(1,211,3,4,5,8,9,10)

a.sortBy(-_).foreach(println) //降序

a.sortBy(+_).foreach(println) //升序

向各位前輩們致敬

參考資料: