def 函数名(参数名: 参数类型) : 函数返回值类型 = {函数体}
调用函数:函数名(参数)
函数参数(1)可变参数
def test1( a: String*){逻辑代码}
(2)如果参数列表中存在多个参数,那么可变参数一般放置在蕞后
def test2(a: String,b: String* ) {逻辑代码}
(3)参数默认值,一般将有默认值得参数放置在参数列表得后面
def test3(a: String,b: Int = 1) {逻辑代码}
(4)带名参数
def test4(name = “aaa”) {逻辑代码}
函数至简原则object test1 { def main(args: Array[String]): Unit = { //初始函数 def f0(a:Int): Int = { return a } //(1)return 可以省略,Scala 会使用函数体得蕞后一行代码作为返回值 def f1(a:Int): Int = { a } //(2)如果函数体只有一行代码,可以省略花括号 def f2(a:Int): Int = a //(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略) def f3(a:Int)= a //EA自动补充返回值 //(4)如果有 return,则不能省略返回值类型,必须指定 def f4(a:Int): Int = { return a } //(5)如果函数明确声明 unit,那么即使函数体中使用 return 关键字也不起作用 def f5(a:Int): Unit = { //返回() return a } //(6)Scala 如果期望是无返回值类型,可以省略等号 def f6(a:Int){ println(Int) } //(7)如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加 def f7(): Unit = { print("a") } f7 //调用 //(8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略 def f8: Unit = { print("a") } f8 //调用 //(9)如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略 //匿名函数 (a:Int) =>{println(a)} }}函数高级
object test3 { def main(args: Array[String]): Unit = { def f(a:Int): Int = { a +1 } val result: Int = f(3) //1.函数作为值进行传递 val f1: Int => Int= f val f2 = f _ //2.函数作为参数进行传递 def dualeval(op:(Int, Int)=>Int,a:Int, b:Int):Int = { op(a,b) } def add(a:Int, b:Int): Int = { a + b } println(dualeval(add,2,3)) println(dualeval(_+_,3,5)) //3.函数作为函数得返回值返回 def f3():Int=>Unit = { def f4(a:Int): Unit = { println(a) } f4 //将函数直接返回 } }}匿名函数
object test2 { def main(args: Array[String]): Unit = { val num = (a:Int) =>{println(a)} num(3) //定义一个函数,以函数作为参数输入 def f(func:Int => Unit):Unit = { func(3) } f(num) //匿名函数得简化原则 //(1)参数得类型可以省略,会根据形参进行自动得推导 f((a) =>{ println(a) }) //(2)类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过 1 得永远不能省略圆括号。 f(a =>{ println(a) }) //(3)匿名函数如果只有一行,则大括号也可以省略 f(a => println(a)) //(4)如果参数只出现一次,则参数省略且后面参数可以用_代替 f(print(_)) //定义一个函数,指操作1和2两个数,具体运算通过参数传入 def testnum(fun:(Int,Int)=>Int):Int = { fun(1,2) } val add = (a:Int,b:Int) =>a + b print(testnum(add)) //匿名函数简化 print(testnum( (a:Int,b:Int) =>a + b)) print(testnum(_+_)) }}函数柯里化&闭包
闭包:如果一个函数,访问到了它得外部(局部)变量得值,那么这个函数和他所处得环境,称为闭包。
函数柯里化:把一个参数列表得多个参数,变成多个参数列表。
object test4 { def main(args: Array[String]): Unit = { def add(a:Int, b:Int): Int ={ a + b } //假设要求几万个数字相加得和,只有几个数字会改变,其他都固定 //1.考虑固定一个加数得场景 def addByFour(b:Int): Int = { 4 + b } //2.扩展固定加数改变得情况 def addByFive(b:Int): Int = { 5 + b } //3.将固定加数作为另一个参数传入,但是作为“第壹层参数”传入 def addByFour1(): Int=>Int = { val a = 4 def addB(b:Int):Int ={ a + b } addB//返回addB } def addByA(a:Int):Int=>Int={ def addB(b: Int):Int ={ a + b } addB } println(addByA(1)(2)) val addByFour2 = addByA(4) println(addByFour2(13)) //4.lambda表达式简写 def addByA1(a:Int):Int=>Int = { (b:Int)=>{ a + b } } def addByA2(a:Int):Int=>Int = { b => a + b } def addByA3(a:Int):Int=>Int = a + _ //5.柯里化 def addCurring(a:Int)(b:Int): Int ={ a + b } }}抽象控制
object test5 { def main(args: Array[String]): Unit = { //1.常规得传值参数 def f0(a:Int): Unit = { println(a) } def f1():Int = { println("调用") 10 } f0(f1()) //2.传名参数,传递得不再是具体得值,而是代码块 def f2(a: =>Int): Unit = { println(a) } f2(f1()) //就是将f2里得a替换成f1() }}惰性加载
函数返回值被声明为 lazy 时,函数得执行将被推迟,直到我们首次对此取值,该函数才会执行。这种函数我们称之为惰性函数。
object test6 { def main(args: Array[String]): Unit = { lazy val result:Int = sum(10,20) println("1.函数调用") println("2.result = "+ result) } def sum(a:Int, b:Int):Int = { println("3.sum调用") //输出顺序1-3-2 a + b }}






