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

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

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。

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)就能求平方根了

用的最常見的就是萬用字元: 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)

相關文章

程式語言 最新文章