乐趣区

关于大数据:大数据开发Scala-下划线的多种场景

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 可能更易懂把,哈哈哈哈
吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。
更多请关注

退出移动版