Scala函数式编程基础篇(方法与函数)

3.1 函数与方法的定义和区别

Scala中方法与java中类似,在类中进行定义,是类的一部分,有参数有返回值。
函数在Scala中是一个对象(继承自Trait类),能够作为变量也能传递给其他函数。
Scala 中使用val可以等于一个函数,使用def定义一个方法。
函数不可以重载,方法可以重载

函数和方法在使用上略有区别
函数定义

def 方法/函数[([参数:c参数类型])][:返回值类型][=]{
    代码
    返回值
}
//def max(a:Int,b:Int):Int{
    if(a>=b)
        a
    else
        b
}
//调用
val n = max(4,6)
// fun1 与 fun2 的写法不推荐
def fun1 = {
    print("hello")
}
def fun2 {
    print("hello")
}
val fun3  = {
    printf("fun3")
}
//在使用val时 不能省略(),否则类似于一个代码块,在运行时能够不调用就能执行。 当无参无返回值时,使用函数或者方法时带上括号。
val fun4(a:Int) = {
// 这是一种错误的写法。也就是说val不能定义一个函数,而是等于一个函数。
}

当定义时不加括号时,调用时也不能带括号(推荐带括号)

3. 2 函数参数的介绍

  • 定长参数:(参数:类型,参数:类型……)
def fun(a:Int,b:Int,c:Int……)  = {
}
  • 可变长参数:(参数:类型*)
def sum(num:Int*) = {
    var res = 0
    for(a <- num){
        res+=a
    }
    print(res)
}
sum(1,3,5,7)
//输出结果为16
  • 默认参数
def add(a:Int=1,b:Double=2)={
    a+b
}
add()        // 不输入任何参数,输出结果为3.0
add(3)       // 按从左到右顺序给参数赋值 输出结果为5.0
add(b=3)    // 按照参数名称给参数赋值 输出结果为4.0

通常情况下可使用默认参数来避免主方法内函数的重载问题。

注意点:在默认参数与非默认参数一起使用时,普通参数在前,默认参数在后,避免出现赋值顺序不对。

3.3 匿名函数

函数可以不被命名。

// 匿名函数的定义:
(参数:参数列表) =>{代码}
val n =(参数:参数列表) =>{代码} 
def fun=(参数:参数列表) =>{代码} 

控制台测试:
在这里插入图片描述
应用:

val max = (x:Int,y:Int) =>{
  if(x>y) x else y
}
 print(max(5,7))

3. 4 函数的柯里化(Curring)

输入的参数是一个一个的括号,而不是在一个括号内.即(a)(b)=(a,b)

//例:
def fun(a:Int,b:Int)= a+b
def fun1(a:Int)(b:Int) = a+b
print(fun(1,2)+" "+fun1(1)(2))//输出结果一模一样。```

fun1与fun2是等价的。(fun2使用了高阶函数)

def fun2(a:Int) = {
  (b:Int) => a+b
}
print(fun2(1)(2))

应用:隐式转换,高阶函数

3. 5 闭包

闭包是一个函数,返回值依赖于函数体以外的变量

val a = 1
def add(b:Int)={
  a+b
}

3. 6 高阶函数

返回值是函数或参数是函数的函数

  1. 参数是一个函数
def fun(fun1:(Int,Int)=>Int)={
  print(fun1)
}
def add(a:Int,b:Int)={
  a+b
}
fun(add)
//或者直接使用匿名函数
def fun2((a:Int,b:Int)=>a+b)={}
//此时fun和fun2都是高阶函数
  1. 返回值是一个函数
def fun2(a: Int) = {
  def fun3(b: Int) = {
    a + b
  }
  fun3 _   //_的作用是阻断函数的运行,作为一个对象返回
}
print(fun2(1)(2))//输出结果为3
def fun2(a: Int) = {
  fun3 _
}
def fun3(b: Int) = {}
//这种写法也可以

高阶函数的应用:map,reduce,filter,foreach,flatmap(后面再总结用法)等等;

注意:函数如果指定了return关键字来进行返回,那么返回值类型不能省略,

如果返回值类型是Unit,则有无return关键字的返回值为()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大da怪i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值