目录

1.scala函数的定义

注意点:

2.递归函数

3.包含参数默认值的函数

4.可变参数个数的函数

5.匿名函数

6.嵌套函数

7.偏应用函数(功能类似包含参数默认值的函数)

8.高阶函数

9.柯里化函数


1.scala函数的定义

➢ 有参函数    ➢ 无参函数

def fun (a: Int , b: Int ) : Unit = {
 println(a+b)
}
fun(1,1)

def fun1 (a : Int , b : Int)= a+b
 println(fun1(1,2))

注意点:

  • ⚫ 函数定义语法 用 def 来定义
  • ⚫ 可以定义传入的参数,要指定传入参数的类型
  • ⚫ 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候
  • ⚫ scala 中函数有返回值时,可以写 return,也可以不写 return,会把函数中最 后一行当做结果返回。当写 return 时,必须要写函数的返回值
  • ⚫ 如果返回值可以一行搞定,可以将{}省略不写
  • ⚫ 传递给方法的参数可以在方法中使用,并且 scala 规定方法的传过来的参数为 val 的,不是 var 的。
  • ⚫ 如果去掉方法体前面的等号,那么这个方法返回类型必定是 Unit 的。这种说 法无论方法体里面什么逻辑都成立,scala 可以把任意类型转换为 Unit.假设, 里面的逻辑最后返回了一个 string,那么这个返回值会被转换成 Unit,并且值会被丢弃。

2.递归函数

/**
 * 递归函数
 * 5的阶乘
 */
 def fun2(num :Int) :Int= {
 if(num ==1)
 num
 else
 num * fun2(num-1)
 }
 print(fun2(5))

3.包含参数默认值的函数

  • 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
  • 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
/**
 * 包含默认参数值的函数
 * 注意:
 * 1.默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值
 * 2.如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称
 */
 def fun3(a :Int = 10,b:Int) = {
 println(a+b)
 }
 fun3(b=2)

4.可变参数个数的函数

多个参数用逗号分开

/**
 * 可变参数个数的函数
 * 注意:多个参数逗号分开
 */
 def fun4(elements :Int*)={
 var sum = 0;
 for(elem <- elements){
 sum += elem
 }
 sum
 }
 println(fun4(1,2,3,4))

遍历:

5.匿名函数

()=>{}就是匿名函数,多用于方法的参数是函数时,常用匿名函数。

1. 有参匿名函数

2. 无参匿名函数

3. 有返回值的匿名函数(可以将匿名函数返回给 val 定义的值,匿名函数不能显式声明函数的返回类型)

/**
 * 匿名函数
 * 1.有参数匿名函数
 * 2.无参数匿名函数
 * 3.有返回值的匿名函数
 * 注意:
 * 可以将匿名函数返回给定义的一个变量
 */
 //有参数匿名函数
 val value1 = (a : Int) => {
 println(a)
}
value1(1)
//无参数匿名函数
 val value2 = ()=>{
 println("我爱尚学堂")
 }
 value2()
 //有返回值的匿名函数
 val value3 = (a:Int,b:Int) =>{
 a+b
 }
 println(value3(4,4))

6.嵌套函数

/**
 * 嵌套函数
 * 例如:嵌套函数求5的阶乘
 */
 def fun5(num:Int)={
 def fun6(a:Int,b:Int):Int={
 if(a == 1){
 b
 }else{
 fun6(a-1,a*b)
 }
 }
 fun6(num,1)
 }
 println(fun5(5))

7.偏应用函数(功能类似包含参数默认值的函数)

偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或 不提供所需参数。

//想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
 val logWithDate = log(date,_:String)
 logWithDate("log11")
 logWithDate("log22")
 logWithDate("log33")

8.高阶函数

函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。

⚫ 函数的参数是函数

⚫ 函数的返回是函数

//1,2,3,4相加
 def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = {
 def f2 (v1: Int,v2:Int) :Int = {
 v1+v2+a+b
 }
 f2
 }
 println(hightFun2(1,2)(3,4))

最后一行当做值返回,返回了一个fun1,因为fun1返回值是一个String,必须显示写出函数返回值类型

⚫ 函数的参数和函数的返回是函数

//函数的参数是函数,函数的返回是函数 :之后是返回值
 def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {
 f
 }
 println(hightFun3(f)(100,200))
 println(hightFun3((a,b) =>{a+b})(200,200))
 //以上这句话还可以写成这样
 //如果函数的参数在方法体中只使用了一次 那么可以写成_表示
println(hightFun3(_+_)(200,200))

9.柯里化函数

可以理解为高阶函数的简化

/**
 * 柯里化函数
 */
 def fun7(a :Int,b:Int)(c:Int,d:Int) = {
 a+b+c+d
 }
 println(fun7(1,2)(3,4))

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐