1、=>的含义 (1)表示匿名函数
//匿名函数 val triple = (x: Double) => 3 * x //执行函数 println(triple(3))说明
(x: Double) 是形参列表, => 是规定语法表示后面是函数体, 3 * x 就是函数体,如果有多行,可以 {} 换行写。匿名函数的返回是通过类型推导来实现的。triple 是指向匿名函数的变量,可以将其看成一个函数。(2)表示(可能是高阶)函数的返回类型
//高阶函数中的方法定义 def test(f: Double => Double, n1: Double) = { f(n1) } //普通函数 def sum(d: Double): Double = { d + d } //方法调用 val res = test(sum, 6.0) println("res=" + res) //12.0说明
test就是一个高阶函数。f: Double(接收) => Double(返回)表示一个函数,该函数可以接收一个Double参数,并返回一个Double参数。n1: Double表示普通参数。f(n1)表示在test函数中执行你传入的函数。(3)在模式匹配中使用
package com.xiaolun.chapter12 object MatchDemo01 { def main(args: Array[String]): Unit = { val oper = '+' val n1 = 20 val n2 = 10 var res = 0 /** * 1、match(类似于java中的switch)和case是关键字 * 2、每个代码块不需要写break */ oper match { case '+' => res = n1 + n2 case '-' => res = n1 - n2 case '*' => res = n1 * n2 case '/' => res = n1 / n2 case _ => println("oper error") } //输出 res=30 println("res=" + res) } } => 等价于 java swtich 的 :。=> 后面的代码块到下一个 case, 是作为一个整体执行,可以使用{} 扩起来,也可以不扩。2、下划线_ (1)导入包中所有的类,作为通配符使用
import util.control.Breaks._(2)面向对象编程的类的属性赋值
import scala.beans.BeanProperty object scala_Demo02 { def main(args: Array[String]): Unit = { val dragon = new Dragon() println(dragon.getName) //null println(dragon.getAge) //0 } } class Dragon { @BeanProperty var name: String = _ @BeanProperty var age: Int = _ }说明
如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值,此时属性必须指定类型。(3)表示元组中元素
def main(args: Array[String]): Unit = { val t1 = (1, "a", "b", true, 2) println(t1._1) //访问元组的第一个元素 ,从1开始。输入1 println(t1.productElement(0)) // 访问元组的第一个元素,从0开始 }说明
访问元组中的数据,可以采用顺序号(_顺序号),也可以通过索引(productElement)访问。(4)指代一个集合中的每个元素
object scala_Demo02 { def main(args: Array[String]): Unit = { val list = List(1, 2, 3) //List(2, 4, 6) println(list.map(_*2)) } }3、匿名函数省略参数情况 (1)_+_的省略情况
object scala_Demo02 { def main(args: Array[String]): Unit = { val list = List(1, 2, 3) println("---------------匿名函数包含单个参数的情况---------------------") //1、匿名函数完整形式 val listMap1 = list.map((n: Int) => (n + 1)) //List(2, 3, 4) println(listMap1) //2、省略参数中的类型 val listMap2 = list.map((n) => (n + 1)) println(listMap2) //3、因为只有一个参数,省略包含参数的小括号 val listMap3 = list.map(n => n + 1) println(listMap3) //4、因为匿名函数中的参数在表达式右边只出现一次,我们使用下划线代替 val listMap4 = list.map(_ + 1) println(listMap4) println("---------------匿名函数包含多个个参数的情况---------------------") //当有多个参数且每个参数在表达式右边也只出现一次时,也可以用下划线简写,但是下划线的顺序与左边参数的顺序一致。 val listMap5 = list.reduceLeft((x:Int,y:Int) => (x+y)) println(listMap5) //6 //省略参数情况1 val listMap6 = list.reduceLeft((x,y) => (x+y)) println(listMap6)//6 //省略参数情况2,等价于上面的式子 val listMap7 = list.reduceLeft(_+_) println(listMap7)//6 } }