本文只是列出一些常見的用法不撑,可能不是全部
將方法轉(zhuǎn)換為函數(shù)
請參見《Scala中Method方法和Function函數(shù)的區(qū)別》
作為函數(shù)的參數(shù)
一個匿名的函數(shù)傳遞給一個方法或者函數(shù)的時候文兢,scala會盡量推斷出參數(shù)類型。例如一個完整的匿名函數(shù)作為參數(shù)可以寫為
scala> def compute(f: (Double)=>Double) = f(3)
compute: (f: Double => Double)Double
//傳遞一個匿名函數(shù)作為compute的參數(shù)
scala> compute((x: Double) => 2 * x)
res1: Double = 6.0
如果參數(shù)x
在=>
右側(cè)只出現(xiàn)一次燎孟,可以用_
替代這個參數(shù)禽作,簡寫為
scala> compute(2 * _)
res2: Double = 6.0
更常見的使用方式為
scala> (1 to 9).filter(_ % 2 == 0)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)
scala> (1 to 3).map(_ * 3)
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 6, 9)
以上所說的為一元函數(shù)尸昧,那么對于二元函數(shù)揩页,即有兩個參數(shù)x和y的函數(shù),是如何使用_
的烹俗?可以參考sortWith方法的定義
def sortWith(lt: (T, T) ? Boolean): Array[T]
這個方法的參數(shù)官方解釋為
the comparison function which tests whether its first argument precedes its second argument in the desired ordering.
這個方法需要的參數(shù)是一個二元函數(shù)爆侣,而且函數(shù)參數(shù)的類型為T,例如
scala> List(10, 5, 8, 1, 7).sortWith(_ < _)
res0: List[Int] = List(1, 5, 7, 8, 10)
可以用_
分別表示二元函數(shù)中的參數(shù)x和y幢妄。
作為標識符
例如定義一個變量val _num = 123
作為通配符
- import語句
例如import scala.math._
- case語句
例如
object MatchTest extends App {
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
println(matchTest(3))
}
- 元組(tuple)
例如
//可以定義一個tuple
scala> val t = (1, 3.14, "Fred")
t: (Int, Double, String) = (1,3.14,Fred)
//可以用_1兔仰,_2,_3訪問這個元組
scala> t._1
res3: Int = 1
scala> t._2
res4: Double = 3.14
scala> t._3
res5: String = Fred
可以通過模式匹配獲取元組的元素蕉鸳,當不需要某個值的時候可以使用_
替代乎赴,例如
scala> val t = (1, 3.14, "Fred")
t: (Int, Double, String) = (1,3.14,Fred)
scala> val (first, second, _) = t
first: Int = 1
second: Double = 3.14
scala> val (first, _, _) = t
first: Int = 1
下劃線和其他符號組合的使用方式
下劃線與等號(_=)
自定義setter方法忍法,請參見《Overriding def with var in Scala》下劃線與星號(_*)
1.變長參數(shù)
例如定義一個變長參數(shù)的方法sum,然后計算1-5的和榕吼,可以寫為
scala> def sum(args: Int*) = {
| var result = 0
| for (arg <- args) result += arg
| result
| }
sum: (args: Int*)Int
scala> val s = sum(1,2,3,4,5)
s: Int = 15
但是如果使用這種方式就會報錯
scala> val s = sum(1 to 5)
<console>:12: error: type mismatch;
found : scala.collection.immutable.Range.Inclusive
required: Int
val s = sum(1 to 5)
^
這種情況必須在后面寫上: _*
將1 to 5
轉(zhuǎn)化為參數(shù)序列
scala> val s = sum(1 to 5: _*)
s: Int = 15
2.變量聲明中的模式
例如饿序,下面代碼分別將arr中的第一個和第二個值賦給first和second
scala> val arr = Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)
scala> val Array(1, 2, _*) = arr
scala> val Array(first, second, _*) = arr
first: Int = 1
second: Int = 2