Scala 的下划线在各类语法中几乎都要插一脚,其目的是表明某些特殊场合或者简化代码,没必要去想命名该怎么取。下面介绍几种下划线的使用场合java
跟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 = _ }
严格的说:使用 val 定义的是函数(function),使用 def 定义的是方法(method)。两者在语义上的区别很小,在绝大
多数状况下均可以不去理会它们之间的区别,可是有时候有必要了解它们之间的转化,方法转换为函数使用下面的方式数组
scala> def f1 = ()=>{} scala> val f2 = f1 _
相似Java
中的*,能够经过此方式导入包中的全部内容函数
//Scala import java.util._ //Java import java.util.*;
在Scala中的高阶函数如map , collection, count,sortWith, filter, reduce等,都需传入一个函数,函数的参数名字自己没有特别的用意,因此没必要再起名上纠结,直接使用_来代替参数,可是要注意单次使用,和多个参数时候的问题大数据
val list = List(3,3,5) list.reduce(_+_) //等同于list.sum() list.map(_ * 2) list.filter(_ > 3)
使用_1 , _2的方式来访问元组中的各个元素人工智能
val tu = (1,2,3) tu._1 tu._2
能够再数组或者集合使用_:*来转为多个参数来使用scala
def addSum(nums: Int*) = { nums.sum } addSum(1 to 10: _*))
在变量名_的方式定义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()) } }
部分应用函数(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 _
在模式匹配中,能够指代默认值,类型匹配的时候,能够使用,能够省去起名字
val a = 10 a match { case _: Int => println("Int") case _ => println("defalult") }
上面主要讲了_的九种用法,其大大简化了Scala的变量命名和开发过程,多用Scala 来简化代码,也是一个Scala程序员的必修课,固然写写Java式的Scala 可能更易懂把,哈哈哈哈
吴邪,小三爷,混迹于后台,大数据,人工智能领域的小菜鸟。
更多请关注