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