目录
定义
函数式编程
将问题分解为一个个步骤,将每个步骤进行封装,作为函数,通过调用这些功能按照指定的步骤,解决问题。
面向对象编程
分解对象的属性,行为 然后通过对象的关系以及行为的调用来解决问题
基础函数编程
基本语法
[修饰符] def 函数名(参数名:参数类型) :返回值类型 ={ 函数体}
函数&方法区别
- 我认为本质区别是一个是面向对象的产物,一个是函数式编程的产物。
- 方法是在类中定义的函数
- 函数是一个完整的对象
- 方法有重载和重写,但是函数没有
函数参数相关概念
可变参数
定义
可以指定若干个数目的参数
使用
在参数列表中定义(参数类型后加*),例如
names:String*
def getString(name:String*) :Unit={
println(name)
}
getString("yxp","yzp","pp")
注意事项
可变参数不能放在参数列表的前面,一般放在最后,否则不好识别
参数默认值
定义
在定义函数时将参数设定一个默认值,在调用该函数时可以不指定该参数
使用
def fun(password:String ='000000')
def getDefaultValue(password:String="000000"):Unit={
println(password)
}
getDefaultValue()
getDefaultValue("123456")
带名参数
定义
在调用函数时指定形参名的值
使用
fun(password="123456")
函数至简原则
简单来说就是能省则省
- 省略return关键字
- 省略花括号
- 省略返回值类型
- 省略参数列表
- 省略等号
- 如果函数体中有明确的return语句,那么返回值类型不能省略
- 如果函数体返回值类型明确为Unit,那么函数体中即使有return关键字也不起作用
- 如果函数体返回值类型声明为Unit,但又想省略,那么此时必须连同等号一起省略
- 省略名称和关键字
高阶函数编程
概述
将函数当成一个类型来使用,而不是当成特定的语法结构。
使用场景
函数作为值
val a =fun1 _
val b = ()=>Unit=fun1
函数作为参数
def fun(f:Int=>Int)
函数作为返回值
def fun1() ={ fun _ }
匿名函数
没有函数名
f:Int=>Int
控制抽象
对一系列语句的封装
def fun(op: =>Unit) ={ op }
fun(println("xx"))
闭包
概述
- 一个函数使用了外部的变量,把这个变量包含到了它的内部来使用,改变了这个变量的生命周期
- 将当前代码形成一个闭合的环境,这个环境称之为闭包环境,简称为闭包
特点
- 内部函数在外部使用的时候会有闭包
- 将函数作为对象使用,会有闭包
- 所有的匿名函数都有闭包
案例
def main(args: Array[String]): Unit = { val i=5; def funclose(a:Int): (Int)=>Unit = { def funinner(b:Int): Unit ={ println(b+a+i) } funinner } funclose(2)(3) }
函数柯里化
概述
将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
案例def fun(i:Int,j:Int): Unit ={ println(i+j) } def fun1(i:Int)(j:Int): Unit ={ println(i+j) }
惰性函数
函数案回执被声明为lazy时函数的执行会被推迟,直到我们首次对此取值,该函数才会执行