大數據開發-Scala 下劃線的多種場景

1.簡述

Scala 的下劃線在各類語法中幾乎都要插一腳,其目的是表明某些特殊場合或者簡化代碼,沒必要去想命名該怎麼取。下面介紹幾種下劃線的使用場合java

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 集合轉爲多個參數

能夠再數組或者集合使用_:*來轉爲多個參數來使用scala

def addSum(nums: Int*) = {
  nums.sum
}

addSum(1 to 10: _*))

2.7 setter方法的實現

在變量名_的方式定義setter方法,code

能夠看出來_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個參數, 那就獲得了一個部分應用函數get

// 定義一個函數
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 可能更易懂把,哈哈哈哈
吳邪,小三爺,混跡於後臺,大數據,人工智能領域的小菜鳥。
更多請關注
file

相關文章
相關標籤/搜索