函数的介绍
-
函数和方法的区别:
- 在oop中,方法必须在类中,不能脱离class独立存在
-
FP中,函数可以独立存在的,不需要依赖于class类
-
对于类似Scala语言(或者Python语言)既是OOP又是FP编程
- 函数的定义:
- 函数就是讲代码块封装起来的可以实现某种功能并且可以重复使用
- 函数的语法:def max(x: Int, y: Int): Int = {}
- def 声明max为一个函数
- max :表示的函数名称
- (x: Int, y: Int) :表示函数的参数(两个参数,参数的类型都为Int类型)
- int :表示的是函数的返回值类型,在Scala中没有void数据类型,Unit表示的就是没有返回值
- 注意:在对函数进行定义时,可以指定函数的参数的默认值,如果不对参数进行重新赋值,就使用默认值,默认值一般都放在参数列表的最后:def sayHello(name: String, say: String = "hello"): Unit = {
- 函数的调用
- 无默认值:从前到后依次赋值
- 有默认值:在调用的时候指定变量 的名称进行赋值,不需要按照顺序;从前到后依次赋值,不需要指定名称(有默认值的也会被赋值)
def pri(x :Int,y :Int =4,z:Int)=print(s"$x,$y,$z") pri(x =4,z =6)
- 函数类型:
- name :String :name表示是变量的名称,String 表示字符串数据类型
- f:(T1,T2)=>R 或 f:T =>R
- f:表示的是函数的名称,(T1,T2)=>R 和T =>R 表示函数类型
- T、T1、T2 :表示的函数的参数的数据类型,此次表示的是泛型
- R表示的是函数的返回值的数据类型,此处也是泛型
- 匿名函数:
- 匿名函数的基本格式:(变量名:参数类型...,变量名:参数类型) =>{函数体}
- 函数体如果是多行代码的话,使用{},如果是单行代码,通常省略{}
- 将一个匿名函数赋值给一个变量 val addValue = (x: Int, y: Int) => x + y
- 匿名函数不需要指定函数体的返回值,将会通过函数体进行推断
- 高阶函数
- 定义:如果函数f的参数中有参数为函数g,则f称为高阶函数
-
高阶函数传递函数参数的方式
-
直接使用匿名函数
- 传递满足要去的函数
-
- 函数的简写:
- scala中通用的简写:
- 当{}里面的代码块就只有一行代码时候,{}可以省略不写
- 当数据的类型可以由代码块推断出时候,可以省略写返回值类型
- scala中函数的简写:
- 函数的返回值类型可以由函数体推断,可以省略
- 如果函数体就只有一行代码,可以省略{}
- 如果函数没有返回值,则可以省略Unit和=
- 如果函数没有参数,则可以省略()
- 匿名函数的简化形式
- 匿名函数的参数的类型可以推断获取,则可以省略不写
- 匿名函数只有一个参数可以省略()
- 如果匿名函数的参数在函数体中有且仅使用一次,而且独立使用,参数可以用_代替
- 由于高阶函数调用匿名函数的时候,匿名函数的参数的数据类型是可以推断出的,所以不需要写明参数的类型
- scala中通用的简写:
- 一些常用的函数
- contains:判断是否包含
- isEmpty:判断是否为空
- max:求最大值
- min:求最小值
- sum:求和
- list1.zip(list2):将两个list合并成一个map
- zipList.unzip:将一个map分解两个list
- list.zipWithIndex:将一个list和其下标合成一个map
- mkString:将数组转换为一个字符串,指定各个元素之间的分隔符:array.mkString(", ")和array.mkString("< ", ", ", " >")(前后加上<和>)
- take:获取前几个
- takeRight:从右边开始获取前几个
- takeLeft:从左边开始获取前几个
- reverse:反转
- swap:二元组的key和value互换位置