1、函数的省略
函数可以定义在object中,类中,函数中
(1)return关键字可以省略,默认最后一行代码作为返回值 (2)返回值类型可以省略,可以根据返回值进行推断 (3)如果只有一行代码,{}可以省略 (4)如果函数没有参数则()可以省略
//函数没有参数时调用可以不加()
def func6 = "hello"
def func5(str: String) =
str.toInt + 100
def func4(str: String) = {
str.toInt + 100
}
def func3(str: String): Int = {
str.toInt + 100
}
2、函数式编程(高阶函数)
面向对象编程:把对象作为参数传入时会有类型限制,对象作为返回值时也会有限制
函数式编程:把函数传来传去,函数作为参数传入时会有类型限制,函数作为返回值时也会有限制
函数式编程:
(1)以函数作为参数
(2)以函数作为返回值
什么是函数的类型
函数的类型由参数(个数,类型,顺序)和返回值类型一起确定(使用 => 表示)
eg:func1是一个(有一个参数,类型为String,返回值类型为Int)类型的函数
funcX(func3) //调用
def func3(i: String): Int = {
i.toInt + 1
}
/**
* f:是funcX需要的参数名称
* String => Int 表示函数的类型(函数参数String,返回值Int)
*/
//定义一个函数funcX可以接收一个函数
def funcX(f: String => Int) = {
val i: Int = f("200")
println(i)
}
3、lambda表达式(匿名函数)
(参数)=> {执行逻辑}
lambda表达式简化
* (1)代码只有一行{}可以省略
* (2)参数类型可以省略,()可以省略
* (3)如果参数只被调用一次,则可以使用_代替 funcX((str: String) => {str.toInt + 1}) funcX(_.toInt + 1)
4、函数作为参数的应用
(1)mkString方法
(2)map方法:对数据进行操作
//定义一个数组
val array: Array[Int] = Array[Int](1,2,3,4,5,6,7,8,9)
println(array)
//指定一个分隔符将数据元素遍历出来
println(array.mkString(" "))
//对数组中每个元素+1
println(array.map(sum).mkString(" "))
println(array.map((i: Int) => {
i + 1
}).mkString(" "))
println(array.map(_ + 1).mkString(" "))
5、函数作为返回值
在以函数作为返回值时需要给定类型
def func1(str1: String): String => Int = {
def func2(str2: String): Int = {
str1.toInt + str2.toInt
}
func2
}
闭包:(内部函数调用时外部变量已经释放了,应该访问不到)
闭包就解决了这个问题,将内部函数所依赖的全部打成一个包(延长时间)
(eg:先调用func1方法,方法名在栈内存中,按道理说是运行完即释放,但是函数也是一个引用,也有一个地址,指向推内存,所以此时在堆内存中会将func1方法等变量打成一个包保存在堆内存中(因为堆内存不会立即释放,根据gc),所以func2调用时还是可以找到的
6、函数柯里化,闭包
将一个由N个参数的函数变成N个只有一个参数的函数(就是将参数分开)
闭包:函数式编程的标配
闭包:如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包
//接收两个参数
def func3(str1: String)(str2: String): Int = {
str1.toInt + str2.toInt
}
//接收两个参数
def func2(str1: String, str2: String): Int = {
str1.toInt + str2.toInt
}
7、偏函数
将一个含有N个参数的函数变成含有N-X个参数的函数(X表示固定的参数)(将参数一部分脱离出去)
8、函数和方法的区别
1)核心概念
(1)为完成某一功能的程序语句的集合,称为函数。
(2)类中的函数称之方法。
2)案例实操
(1)Scala 语言可以在任何的语法结构中声明任何的语法
(2)函数没有重载和重写的概念;方法可以进行重载和重写
(3)Scala 中函数可以嵌套定义