一直以來都對scala中“=>”的使用比較迷茫,也不知道他表示什么意思。今天就它的使用場景列舉如下,希望可以共同探討。
-
表示函數的返回類型(Function Type)
scala> def double(x: Int): Int = x*2 double: (x: Int)Int //定義一個函數變量: scala> var x : (Int) => Int = double x: Int => Int = <function1> //調用 scala> x(2) res1: Int = 4
函數double的類型就是 (x: Int) => Int 或者 Int => Int。左邊是參數類型,右邊是方法返回值類型。
備注: 當函數只有一個參數的時候,函數類型里面括起來函數參數的括號是可以省略的。
-
匿名函數
//通過匿名函數定義一個函數變量xx scala> var xx = (x: Int) => x + 1 xx: Int => Int = <function1> //給一個高階函數,傳遞一個函數: scala> val newList = List(1,2,3).map { (x: Int) => x * 2 } newList: List[Int] = List(2, 4, 6)
匿名函數定義, 左邊是參數 右邊是函數實現體 (x: Int)=>{}
-
case語句
scala> val x = 10; val y = 20 x: Int = 10 y: Int = 20 scala> val max = x > y match { case true => x case false => y } max: Int = 20
在模式匹配 match 和 try-catch 都用 “=>” 表示輸出的結果或返回的值
-
By-Name Parameters(傳名參數),傳名參數在函數調用前表達式不會被求值,而是會被包裹成一個匿名函數作為函數參數傳遞下去,例如參數類型為無參函數的參數就是傳名參數。
scala> def doubles(x: => Int) = { println("Now doubling " + x) x*2 } doubles: (x: => Int)Int //調用函數 scala> doubles(3) Now doubling 3 res2: Int = 6 scala> def f(x: Int): Int = { println(s"Calling f($x)") x } f: (x: Int)Int //調用函數 scala> doubles(f(3)) Calling f(3) Now doubling 3 Calling f(3) res9: Int = 6
對於函數doubles而言,它的參數x就是by-name的。如果調用doubles的時候,直接給個普通的值或者非函數變量。那么doubles的執行結果就跟普通的函數沒有區別。但是當把一個返回值為Int類型的函數,例如f(2),傳遞給doubles的時候。那么f(2)會被先計算出返回值2,返回值2傳入doubles參與運算。運算完成以后,f(2)會被doubles在執行以后,再調用一遍。