9.1.5、Scala__函数式编程,函数的省略,高阶函数,lambda表达式(匿名函数),函数作为参数,函数作为返回值,函数柯里化,闭包,偏函数,函数和方法的区别

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 中函数可以嵌套定义

猜你喜欢

转载自blog.csdn.net/nerer/article/details/121255466