[轉(zhuǎn)]Scala 中下劃線的用途

原文鏈接:https://my.oschina.net/leejun2005/blog/405305

Scala 作為一門函數(shù)式編程語言,對習(xí)慣了指令式編程語言的同學(xué)來說,會(huì)不大習(xí)慣击狮,這里除了思維方式之外,還有語法層面的,比如 underscore(下劃線)就會(huì)出現(xiàn)在多種場合段磨,令初學(xué)者相當(dāng)疑惑,今天就來總結(jié)下 Scala 中下劃線的用法耗绿。

1苹支、存在性類型:Existential types
def foo(l: List[Option[_]]) = ...

2、高階類型參數(shù):Higher kinded type parameters
case class A[K[_],T](a: K[T])

3误阻、臨時(shí)變量:Ignored variables
val _ = 5

4债蜜、臨時(shí)參數(shù):Ignored parameters
List(1, 2, 3) foreach { _ => println("Hi") }

5晴埂、通配模式:Wildcard patterns
Some(5) match { case Some(_) => println("Yes") }
match {
     case List(1,_,_) => " a list with three element and the first element is 1"
     case List(_*)  => " a list with zero or more elements "
     case Map[_,_] => " matches a map with any key type and any value type "
     case _ =>
 }
val (a, _) = (1, 2)
for (_ <- 1 to 10)

6、通配導(dǎo)入:Wildcard imports
import java.util._

7寻定、隱藏導(dǎo)入:Hiding imports
// Imports all the members of the object Fun but renames Foo to Bar
import com.test.Fun.{ Foo => Bar , _ }

// Imports all the members except Foo. To exclude a member rename it to _
import com.test.Fun.{ Foo => _ , _ }

8儒洛、連接字母和標(biāo)點(diǎn)符號:Joining letters to punctuation
def bang_!(x: Int) = 5

9、占位符語法:Placeholder syntax
List(1, 2, 3) map (_ + 2)
_ + _   
( (_: Int) + (_: Int) )(2,3)

val nums = List(1,2,3,4,5,6,7,8,9,10)

nums map (_ + 2)
nums sortWith(_>_)
nums filter (_ % 2 == 0)
nums reduceLeft(_+_)
nums reduce (_ + _)
nums reduceLeft(_ max _)
nums.exists(_ > 5)
nums.takeWhile(_ < 8)

10狼速、偏應(yīng)用函數(shù):Partially applied functions
def fun = {
    // Some code
}
val funLike = fun _

List(1, 2, 3) foreach println _

1 to 5 map (10 * _)

//List("foo", "bar", "baz").map(_.toUpperCase())
List("foo", "bar", "baz").map(n => n.toUpperCase())

11琅锻、初始化默認(rèn)值:default value
var i: Int = _

12、作為參數(shù)名:
//訪問map
var m3 = Map((1,100), (2,200))
for(e<-m3) println(e._1 + ": " + e._2)
m3 filter (e=>e._1>1)
m3 filterKeys (_>1)
m3.map(e=>(e._1*10, e._2))
m3 map (e=>e._2)

//訪問元組:tuple getters
(1,2)._2

13向胡、參數(shù)序列:parameters Sequence 
_*作為一個(gè)整體恼蓬,告訴編譯器你希望將某個(gè)參數(shù)當(dāng)作參數(shù)序列處理。例如val s = sum(1 to 5:_*)就是將1 to 5當(dāng)作參數(shù)序列處理僵芹。
//Range轉(zhuǎn)換為List
List(1 to 5:_*)

//Range轉(zhuǎn)換為Vector
Vector(1 to 5: _*)

//可變參數(shù)中
def capitalizeAll(args: String*) = {
  args.map { arg =>
    arg.capitalize
  }
}

val arr = Array("what's", "up", "doc?")
capitalizeAll(arr: _*)

這里需要注意的是处硬,以下兩種寫法實(shí)現(xiàn)的是完全不一樣的功能:

foo _               // Eta expansion of method into method value

foo(_)              // Partial function application

Example showing why foo(_) and foo _ are different:

trait PlaceholderExample {
  def process[A](f: A => Unit)

  val set: Set[_ => Unit]

  set.foreach(process _) // Error 
  set.foreach(process(_)) // No Error
}

In the first case, process _ represents a method; Scala takes the polymorphic method and attempts to make it monomorphic by filling in the type parameter, but realizes that there is no type that can be filled in for A that will give the type (_ => Unit) => ? (Existential _ is not a type).

In the second case, process(_) is a lambda; when writing a lambda with no explicit argument type, Scala infers the type from the argument that foreach expects, and _ => Unit is a type (whereas just plain _ isn't), so it can be substituted and inferred.

This may well be the trickiest gotcha in Scala I have ever encountered.

Refer:

[1] What are all the uses of an underscore in Scala?

http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala

[2] Scala punctuation (AKA symbols and operators)

http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators/7890032#7890032

[3] Scala中的下劃線到底有多少種應(yīng)用場景?

http://www.zhihu.com/question/21622725

[4] Strange type mismatch when using member access instead of extractor

http://stackoverflow.com/questions/9610736/strange-type-mismatch-when-using-member-access-instead-of-extractor/9610961

[5] Scala簡明教程

http://colobu.com/2015/01/14/Scala-Quick-Start-for-Java-Programmers/

[6] Scala入門到精通——第二十三節(jié) 高級類型 (二)

https://yq.aliyun.com/articles/60371#

原文鏈接:https://my.oschina.net/leejun2005/blog/405305

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拇派,一起剝皮案震驚了整個(gè)濱河市荷辕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌件豌,老刑警劉巖疮方,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苟径,居然都是意外死亡案站,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門棘街,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟆盐,“玉大人,你說我怎么就攤上這事遭殉∈遥” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵险污,是天一觀的道長痹愚。 經(jīng)常有香客問我,道長蛔糯,這世上最難降的妖魔是什么拯腮? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蚁飒,結(jié)果婚禮上动壤,老公的妹妹穿的比我還像新娘。我一直安慰自己淮逻,他們只是感情好琼懊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布阁簸。 她就那樣靜靜地躺著,像睡著了一般哼丈。 火紅的嫁衣襯著肌膚如雪启妹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天醉旦,我揣著相機(jī)與錄音饶米,去河邊找鬼。 笑死车胡,一個(gè)胖子當(dāng)著我的面吹牛咙崎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吨拍,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼网杆!你這毒婦竟也來了羹饰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤碳却,失蹤者是張志新(化名)和其女友劉穎队秩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼浦,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馍资,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了关噪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟蟹。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖使兔,靈堂內(nèi)的尸體忽然破棺而出建钥,到底是詐尸還是另有隱情,我是刑警寧澤虐沥,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布熊经,位于F島的核電站,受9級特大地震影響欲险,放射性物質(zhì)發(fā)生泄漏镐依。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一天试、第九天 我趴在偏房一處隱蔽的房頂上張望槐壳。 院中可真熱鬧,春花似錦秋秤、人聲如沸宏粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍哎。三九已至来农,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崇堰,已是汗流浹背沃于。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留海诲,地道東北人繁莹。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像特幔,于是被迫代替她去往敵國和親咨演。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容