一麻诀、函數(shù)當做參數(shù)
def oncePerSecond(callback: () => Unit) {
val random = new Random
while(true) {
callback();
Thread sleep 10
println(random.nextInt(50))
}
}
二痕寓、惰性賦值
//惰性賦值:當使用lazy修飾一個val成員時,其賦值情況是在需要時才賦值的(by need)
// lazy val field = computation()
三蝇闭、協(xié)變呻率、逆變樣例
def contravariant = {
val a:Consumer[Bird] = new Consumer[Bird](new Bird())
// val b:Consumer[Animal] = a // wrong
val a1:Consumer1[Bird] = new Consumer1[Bird](new Bird())
val b1:Consumer1[Animal] = a1 //協(xié)變 向上轉型
println(b1)
val b2:Consumer1[Animal] = new Consumer1[Animal](new Animal())
// val a2:Consumer1[Bird] = b2 // wrong
val b3:Consumer2[Animal] = new Consumer2[Animal](new Animal())
val a3:Consumer2[Bird] = b3 //逆變 向上轉型
}
四、for表達式中的模式
import scala.collection.JavaConversions.propertiesAsScalaMap
for ((k,v)<- System.getProperties) println(k+"="+v)
五呻引、case class copy and 帶名參數(shù)
val p1 = Person("id1","name1",11)
val p2 = p1.copy()
println(s"p1=$p1")
println(s"p2=$p2")
val p3 = p1.copy(name="name2")
println(s"p3=$p3")
六礼仗、偏函數(shù)
val foo : Option[String] => String = {
case Some(e) => e
case None => "???"
}
七、傳值調用:先計算參數(shù)表達式的值苞七,傳名調用:將未計算的參數(shù)表達式直接應用到函數(shù)內部
object Add {
def addByName(a: Int, b: => Int) = a + b
def addByValue(a: Int, b: Int) = a + b
}
addByName(2, 2 + 2)
->2 + (2 + 2)
->2 + 4
->6
addByValue(2, 2 + 2)
->addByValue(2, 4)
->2 + 4
->6
八藐守、CanBuildFrom
http://blog.bruchez.name/2012/08/getting-to-know-canbuildfrom-without-phd.html
def combineValues[U, T[_]](pairs : Seq[(U, U)])
(implicit cbf : CanBuildFrom[T[U], U, T[U]]): Seq[(U, T[U])] = {
val result = LinkedHashMap[U, Builder[U, T[U]]]()
for ((name, value) ← pairs)
result.getOrElseUpdate(name, cbf()) += value
result map { case (k, v) ? k → v.result } toList
}
def combine_value = {
val seq = Seq[(String,String)](("n1","v1"),("n2","v2"),("n1","v3"))
println(combineValues[String,Set](seq))
}