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和stackoverflowWhat 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 |