scala快速上手(三) Scala 方法与函数

Scala 方法与函数

 

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. 偏应用函数

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

/**
* 偏应用函数
*/
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
}
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
发出的红包

打赏作者

plenilune-望月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值