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.scala
object DemoFun02 {
// func1是一个”以String以及Int作为参数,Int作为返回值“类型的函数
// (String,Int) => Int
def func1(str: String, int: Int): Int = {
str.toInt + int
}
//(Int,String)=>Int
def func2(int: Int, string: String): Int = {
int + string.toInt
}
//(String,Int)=>Int
def func3(str: String, int: Int): Int = {
str.toInt * int
}
// String => Int
def 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.scala
object 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.scala
object 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))
}
}