Scala中的方法与函数

1.方法的定义

  • 有参方法
  • 无参方法
    在这里插入图片描述
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.参数有默认值

  • 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
  • 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
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.匿名函数 () => {}

  • 有参匿名函数
  • 无参匿名函数
  • 有返回值的匿名函数
  • 可以将匿名函数返回给val定义的值
  • 匿名函数不能显式声明函数的返回类型
  • 匿名函数内部用了一次 可以用下划线替代
  • 常用在foreach等函数的参数里面
/**
 * 匿名函数
 * 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.偏应用函数

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

/**
 * 偏应用函数
 */
def log(date :Date, s :String)= {
  println("date is "+ date +",log is "+ s)
}

val date = new Date()
log(date ,"log1")
log(date ,"log2")
log(date ,"log3")


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

8.高阶函数

  • 函数的参数是函数
  • 函数的返回是函数
  • 函数的参数和函数的返回是函数
//函数的参数是函数  需要指定函数类型 利用=> 匿名函数
def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {
  f(a,100)
}
def f(v1 :Int,v2: Int):Int  = {
  v1+v2
}

println(hightFun(f, 1))

//函数的返回是函数  必须显示的写出返回值类型
//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  
//f2_  说明函数
}
println(hightFun2(1,2)(3,4))

//函数的参数是函数,函数的返回是函数
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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值