1.簡述
Scala 的下劃線在各種語法中幾乎都要插一腳,其目的是代表某些特殊場合或者簡化代碼,不必去想命名該怎么取,下面介紹幾種下劃線的使用場合
2. _ 有哪些使用方式
2.1 初始化變數
跟Java 類似,成員變數未初始化會給一個默認值,Scala中也一樣,只可以初始化成員變數,但是需要利用_來特別說明,要注意的是_如果初始化為null 要特別指明變數的型別,否則變數型別就是Null, 初始化只針對var 而不能是val, 其他情況使用變數類似和_即可達到初始化的效果
// _ 對應的默認值:整型默認值0;浮點型默認值0.0;String與參考型別,默認值null; Boolean默認值false
class Student{
//String型別的默認值為null
var name : String = _
var age: Int = _
var amount: Double = _
var mOrF: Boolean = _
}
2.2 方法轉為函式
嚴格的說:使用 val 定義的是函式(function),使用 def 定義的是方法(method),二者在語意上的區別很小,在絕大
多數情況下都可以不去理會它們之間的區別,但是有時候有必要了解它們之間的轉化,方法轉換為函式使用下面的方式
scala> def f1 = ()=>{}
scala> val f2 = f1 _
2.3 導包
類似Java 中的*,可以通過此方式匯入包中的所有內容
//Scala
import java.util._
//Java
import java.util.*;
2.4 高階函式中省去變數名
在Scala中的高階函式如map , collection, count,sortWith, filter, reduce等,都需傳入一個函式,函式的引數名字本身沒有特別的用意,所以不必再起名上糾結,直接使用_來代替引數,但是要注意單次使用,和多個引數時候的問題
val list = List(3,3,5)
list.reduce(_+_) //等同于list.sum()
list.map(_ * 2)
list.filter(_ > 3)
2.5 訪問元組
使用_1 , _2的方式來訪問元組中的各個元素
val tu = (1,2,3)
tu._1
tu._2
2.6 集合轉為多個引數
可以再陣列或者集合使用_:*來轉為多個引數來使用
def addSum(nums: Int*) = {
nums.sum
}
addSum(1 to 10: _*))
2.7 setter方法的實作
在變數名_的方式定義setter方法,
可以看出來_leg 是徹底的封裝,而leg_是leg方法的set版本
class Dog {
private var _leg = 0
def leg: Int = _leg
def leg_=(newLag: Int) = {
_leg = newLag
}
def get() = {
_leg
}
}
object GetterAndSettre {
def main(args: Array[String]): Unit = {
val dog = new Dog
dog.leg_=(4) //等同于 dog.leg = 4 ,都是修改了_leg的值
println(dog.get())
dog.leg = 5
println(dog.get())
}
}
2.8 部分函式使用
部分應用函式(Partial Applied Function)也叫偏應用函式,部分應用函式是指缺少部分(甚至全部)引數的函式,如果一個函式有n個引數, 而為其提供少于n個引數, 那就得到了一個部分應用函式
// 定義一個函式
def add(x:Int, y:Int, z:Int) = x+y+z
// Int不能省略
def addX = add(1, _:Int, _:Int)
addX(2,3)
addX(3,4)
def addXAndY = add(10, 100, _:Int)
addXAndY(1)
def addZ = add(_:Int, _:Int, 10)
addZ(1,2)
// 省略了全部的引數,下面兩個等價,第二個更常用
def add1 = add(_: Int, _: Int, _: Int)
def add2 = add _
2.9 模式匹配
在模式匹配中,可以指代默認值,型別匹配的時候,可以使用,可以省去起名字
val a = 10
a match {
case _: Int => println("Int")
case _ => println("defalult")
}
3. 總結
上面主要講了_的九種用法,其大大簡化了Scala的變數命名和開發程序,多用Scala 來簡化代碼,也是一個Scala程式員的必修課,當然寫寫Java式的Scala 可能更易懂把,哈哈哈哈
吳邪,小三爺,混跡于后臺,大資料,人工智能領域的小菜鳥,
更多請關注

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237927.html
標籤:其他
