1.简述
Scala 的下划线在各种语法中简直都要插一脚,其目标是代表某些非凡场合或者简化代码,不用去想命名该怎么取。上面介绍几种下划线的应用场合
2. _ 有哪些应用形式
2.1 初始化变量
跟Java
相似,成员变量未初始化会给一个默认值,Scala
中也一样,只能够初始化成员变量,然而须要利用_来特地阐明,要留神的是_如果初始化为null
要特地指明变量的类型,否则变量类型就是Null
, 初始化只针对var
而不能是val
, 其余状况应用变量相似和_即可达到初始化的成果
// _ 对应的默认值:整型默认值0;浮点型默认值0.0;String与援用类型,默认值null; Boolean默认值falseclass 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
中的*,能够通过此形式导入包中的所有内容
//Scalaimport java.util._//Javaimport 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._1tu._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 = 10a match { case _: Int => println("Int") case _ => println("defalult")}
3. 总结
下面次要讲了_的九种用法,其大大简化了Scala的变量命名和开发过程,多用Scala 来简化代码,也是一个Scala程序员的必修课,当然写写Java式的Scala 可能更易懂把,哈哈哈哈
吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。
更多请关注