標籤:

Scala中的下劃線到底有多少種應用場景?

import java.lang._

類似這樣的下劃線。


我目前了解的有一下幾個用處:

1、作為「通配符」,類似Java中的*。如import scala.math._

2、:_*作為一個整體,告訴編譯器你希望將某個參數當作參數序列處理!例如val s = sum(1 to 5:_*)就是將1 to 5當作參數序列處理。

3、指代一個集合中的每個元素。例如我們要在一個Array a中篩出偶數,並乘以2,可以用以下辦法:

a.filter(_%2==0).map(2*_)。

又如要對緩衝數組ArrayBuffer b排序,可以這樣:

val bSorted = b.sorted(_

4、在元組中,可以用方法_1, _2, _3訪問組員。如a._2。其中句點可以用空格替代。

5、使用模式匹配可以用來獲取元組的組員,例如

val (first, second, third) = t

但如果不是所有的部件都需要,那麼可以在不需要的部件位置上使用_。比如上一例中val (first, second, _) = t

6、還有一點,下劃線_代表的是某一類型的默認值。

對於Int來說,它是0。

對於Double來說,它是0.0

對於引用類型,它是null。

歡迎指正補充!


請善用google和stackoverflow

What are all the uses of an underscore in Scala?

Anantha Kumaran

http://www.slideshare.net/normation/scala-dreaded


scala中與_相關的用法還是挺多的:

1 import導入包的所有成員,相當於java的*,而*在scala中可以作為合法的identifier。比java方便的一點是它可以導入某個類下的所有靜態成員,java則需要import static。

2 佔位符:這個用法比較多,表示某一個參數。比如對collection或sequence調用方法map、filter、sortWith、foreach等等表示對每一個元素進行處理,甚至可以使用http://_.XXX方式;還有參數推導時f(250*_),假設已知f的參數類型是Int=&>Int的函數類型時,可以在匿名函數中250*_使用_表示Int 參數,還比如val f = 250 * (_: Int);在模式匹配中根據unapply來初始化變數或集合時,如果不關心變數的某個具體屬性或集合的某些元素則使用_來忽略,比如val Array(first, second, _*) = arr,只將arr的前2個值分別賦給first和second,這在match case class中用得比較多。

3 對變數進行默認初始化,比如var i:Int=_

4 訪問tuple變數的某個元素時通過索引_n來取得第n個元素

5 向函數或方法傳入可變參數時不能直接傳入Range或集合或數組對象,需要使用:_*轉換才可傳入

6 類的setter方法,比如類A中定義了var f,則相當於定義了setter方法f_=,當然你可以自己定義f_=方法來完成更多的事情,比如設置前作一些判斷或預處理之類的操作

7 用於將方法轉換成函數,比如val f=sqrt _,以後直接調用f(250)就能求平方根了


淺談 Scala 中下劃線的用途 整理的很全面


Scala基礎 - 下劃線使用指南


用的最常見的就是通配符: List(1,2,3).foreach(println(_))

元組裡取值 ("a","b","c")._3

引包的時候全引 :

import com.zte.bigdata.vmax.app.metadata.datamanage.service.VirtualTaskList._


一個場景就你這個例子,類似import java.util.*;中的*。另一個場景,就是當參數佔位符用,比如list.filter(_ &> 0)


import org.apache.spark.sql.{Dataset, _}

這裡的"_"表示隱藏導入,但什麼是隱藏導入呢?「_」又代表什麼內容?


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


推薦閱讀:

TAG:Scala |