1.基本语法
解析main方法
def main(args: Array[String]): Unit = {函数体}*def 关键字,声明一个函数 * main 方法名 * args 参数名称 * Array[String] 参数的类型 * Unit 返回值类型,相当于Java中的void,没有返回值 * {} 函数体
函数省略规则
(1)return可以省略,Scala会使用函数体的最后一行代码作为返回值
(2)如果函数体只有一行代码,可以省略花括号
(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
(4)如果函数没有参数,那么小括号可以省略,调用时小括号也必须省略
函数调用
scala可以在类中定义函数,通过类的方法调用
在object中定义函数,通过类方法调用
同时可以在函数内部调用
2.函数式编程
面向函数编程: 将函数传来传去,将函数作为参数 或者是 返回值,需要考虑类型的限制
2.1 以函数为参数
package com.bigdata.scalaobject DemoFun02 {// func1是一个”以String以及Int作为参数,Int作为返回值“类型的函数// (String,Int) => Intdef func1(str: String, int: Int): Int = {str.toInt + int}//(Int,String)=>Intdef func2(int: Int, string: String): Int = {int + string.toInt}//(String,Int)=>Intdef func3(str: String, int: Int): Int = {str.toInt * int}// String => Intdef func4(str: String): Int = {str.toInt + 100 + 100}// 定义一个函数funcX,能够接收一个函数func// 接收的函数func的类型为 (String,Int) => Int// 最终实现对传入的函数func进行调用,并打印返回的结果def funcX(func:(String,Int)=>Int):Unit={val i: Int = func("100", 200)println(i)}def main(args: Array[String]): Unit = {funcX(func1)}}
2.2 匿名函数
没有名字的函数就是匿名函数
定义匿名函数:(参数名:参数类型,参数名:参数类型,参数名:参数类型) => {方法体}
package com.bigdata.scalaobject DemoAnoymousFun {//定义匿名函数(str:String,int:Int)=>{str.toInt+int}//为匿名函数取名val anonymousFun: (String, Int) => Int = (str: String, int: Int) => {str.toInt + int}def funcX(func: (String, Int) => Int): Unit = {val i: Int = func("100", 200)println(i)}def funcX2(func: String=> Int): Unit = {val i: Int = func("100")println(i)}def main(args: Array[String]): Unit = {//调用匿名函数,调用函数名,间接调用funcX(anonymousFun)//直接调用匿名函数funcX((str: String, int: Int) => {str.toInt + int})//几种省略funcX((str: String, int: Int) => str.toInt + int) //一行函数体,省略{}funcX((str,int)=>str.toInt+int) //匿名函数是作为参数传递给另一个函数,则参数的类型可以省略funcX2(str=>str.toInt) //如果匿名函数的参数只有一个,则括号可以省略funcX2(_.toInt)/*如果匿名函数的参数只有一个,并且只被使用了一次,则可以用下划线替代,并且关于参数声明的部分可以直接省略,以及 => 也需要省略*/}}
匿名函数的省略规则
1、如果代码只有一行 花括号可以省略
2、如果匿名函数作为 参数 传给另外一个函数 则匿名函数的参数类型可以省略
3、如果匿名函数只有一个参数则括号可以省略
4、如果匿名函数中的参数在逻辑中只使用了一次 则可以用下划线替代 然后 => 左边的部分可以省略
2.3 函数作为返回值
package com.bigdata.scalaobject DemoFun03 {//函数作为返回值,返回值的类型无法推断,需要手动指定def fun01(str:String): Int=>Int = {def fun01_01(int: Int):Int={str.toInt+int+100}fun01_01}//简化函数定义def fun02(str: String)(int:Int): Int = {str.toInt + int + 100}//函数柯里化//将有N个参数的函数,变成N个只有一个参数的函数def func03_KL(i1: Int)(i2: Int)(i3: Int)(i4: Int)(i5: Int): Int = {i1 + i2 + i3 + i4 + i5}def main(args: Array[String]): Unit = {val intToInt: Int => Int = fun01("20")val i: Int = intToInt(20)println(i)//简化调用println(fun01("20")(20))println(fun02("50")(50))val kl: Int => Int => Int = func03_KL(1)(2)(3)println(kl(40)(50))}}