scala_函数篇

本文详细探讨了Scala中的函数与方法的区别,强调了函数作为对象的特性,包括函数无重载重写、嵌套声明、返回值类型推断等概念。讲解了Unit类型的特殊性、匿名函数的使用以及函数作为值、参数和返回值的情况。此外,还涉及了闭包、控制抽象、函数柯里化、递归函数和惰性求值等高级主题,揭示了Scala函数的强大与灵活性。
摘要由CSDN通过智能技术生成

0.其它
scala中方法是组成类的一部分,函数则是一个完整的对象。函数没有重载和重写的概念,函数可以嵌套声明使用,作用域小(编译后private static final),不强调功能的从属关系。函数的本质是方法。

scala所有表达式都是有返回值的,表达式的返回值是表达式中最后一行代码的执行结果。但返回值不一定都有值。函数中无返回值的意思就是返回值类型为Unit,打印出来体现为()

注意区分main方法中的返回值Unit,容易混淆

给a赋值的过程中会体现执行过程,会打印出hello zhangsan,println(a)语句会打印返回值()

1.省略return,是因为scala具备推断返回值类型的能力。必须使用return的情况是return存在多个条件分支中。
2.如果可以推断返回值类型,则返回值类型可以省略(如果有return,返回值类型不能省略)
(Unit的省略必须要省略等号与冒号)(看见Unit,return就不起作用了)
3.如果函数体只有一行逻辑代码,大括号可以省略
4.如果没有参数,参数列表可以省略,此时调用函数不能加()
5.如果返回值是Unit,则return会不起作用;
6.匿名函数:省略名称、关键字、返回值类型(匿名函数本身就是函数对象即f,f()是执行函数)

匿名函数
1.函数作为值(函数作为对象,即要给别人使用,参数最多22个)
val a = fun _ 等价于 val a : () => Unit = fun 两者都将函数作为对象给变量a(后者加_也能用)
val a = fun 无参数省略() 将执行结果给变量a,包括执行结果与返回值两部分

2.函数作为参数
函数作为参数的话,函数名就是形参,无所谓随便取,占位的而已
匿名函数主要应用于函数作为参数(匿名函数本身是个对象)

匿名函数作为参数的意义在于把匿名函数这套输入输出规则函数以对象形式传给函数,再让函数用具体的值去调用该规则(该匿名函数)。_ + 这种就是匿名函数
1.如果函数体只有一行逻辑代码,大括号可以省略
2.如果参数类型可以推断出来,那参数类型也可省略(参数类型的推断 针对匿名函数
3.如果参数只有一个的话,参数列表小括号可以省略
4.如果参数在使用时,按照顺序只使用了一次,那么可以用下划线代替参数test(
- _)

匿名函数:输入(形参列表)=>输出(执行逻辑)函数类型:参数类型列表=>返回值类型

匿名函数作为参数的完整用法,实现两个数的任意功能
def twoNumsMethod(x : Int, y : Int, f : (Int, Int) => Int) = println(f(x, y)) 要么省略等于号,要么省略大括号。两者不能同时省略。
或者 def twoNumsMethod(x : Int, y : Int, f : (Int, Int) => Int) {println(f(x, y))}
此方法可以定义两个数的任意方法加减乘除取余等,注意:f是方法的占位符,(Int, Int) => Int是方法的类型
twoNumsMethod(10, 20, +),注意:_代替参数是在参数使用时,即函数调用时

3.函数作为返回值
函数作为返回值,一般应用于将内部函数在外部使用

4.闭包
一个函数使用了外部的变量,把这个变量包含到了它的内部来使用,改变了这个变量的生命周期。
1.内部函数在外部使用会有闭包
2. 将函数作为对象使用,会有闭包(对象别人可以调用,所以生命周期改变了)
3. 所有匿名函数都有闭包(匿名函数相当于作为对象使用)

5.控制抽象
抽象理解为不完整,需要具体实现完整性,即无参数输入,无返回值返回。控制抽象一般用于语法设计,比如breakble
在这里插入图片描述
在这里插入图片描述

Breakble函数中,op为形参函数,op的函数类型中参数列表不完整,具备抽象性,因此传实参的时候可以传任意代码。尝试该代码,发现异常就抛出来。
scala中调用函数时,既可以使用圆括号来传参,也可以使用大括号来传参。
所以breakble() breakble{}都可以

6.函数柯里化
方法调用功能的时候,传递的多个参数逻辑上不一定有关系,处理上也不一定有关系,不应该等待和放到一块,将无关的参数分离开就叫函数的柯里化。test(a)(b)就是柯里化。
在这里插入图片描述

7.递归函数
1.scala中要求递归函数必须声明返回值类型
2.函数内部调用自身
3.一定要有跳出递归的逻辑
4.递归函数在调用时传递的参数之间有关系
在这里插入图片描述

println放test1()上面的话是真递归,会一直压栈,最后会报stackoverflow的错,栈帧滚动。
如图叫尾递归,scala会优化为一个while循环,会一直压栈弹栈,不停打印test。
Java也有尾递归,不过没优化,压栈弹栈都来自test1()这行代码,顺序模糊不清,因此java尾递归会比正常递归延迟报错。

8.惰性函数
被lazy修饰的函数返回值,用到该函数对象时,该函数才会执行声明对象出来。
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值