【scala专栏_持续更新】15_scala函数

【大纲】
在这里插入图片描述

【正文】

1.【结论】函数语法

val 函数变量名 = (参数名: 参数类型, 参数名: 参数类型) => {函数体代码块}
    
# 说明:
    0.函数变量名的数据类型是Function2,即,scala中的函数,是一个变量,是一个对象。所以函数,可以作为参数来传递。函数可作为方法和函数的参数、可作为方法的返回值
    
    1.函数的参数类型可省略不写,会自动推断
    
    2.=>符号 代表 转变成、计算成
    
    3.函数无需指定返回值类型,会根据{函数体代码块}中具体返回什么值自动推断,如果没有返回值当然是返回Unit对象
    
    4.函数的另一种语法:
        val getSum:(Int => Int) = x => x + 1 ,其中,Int => Int是函数的数据类型

示例

# 定义函数
scala> val getSum = (x:Int, y:Int) => x + y
getSum: (Int, Int) => Int = <function2>
# 调用函数
scala> val a = getSum(1,2)
a: Int = 3
# 定义函数
scala> val min = (x:Int, y:Int) => {if (x < y) x else y}
min: (Int, Int) => Int = <function2>
# 调用函数
scala> val a = min(1,2)
a: Int = 1

2.【结论】匿名函数

(参数名: 参数类型, 参数名: 参数类型) => {函数体代码块}

示例

# 匿名函数
scala> (z:Int, y:Int) => z + y
res1: (Int, Int) => Int = <function2>

3.【结论】方法和函数的区别

0.java中,函数和方法是一个东西,只是叫法不同。scala中,方法同java的方法,函数是个变量(对象),可和变量一样进行参数与返回值的传递

1.方法隶属于类或对象,程序运行时,方法被加载到JVM的方法区,调用到方法时,方法对象会加载进栈内存

2.将函数对象赋值给一个变量,程序运行时,函数加载到JVM的堆内存

3.函数是一个对象,继承自FunctionN,函数对象有apply()、curried()、toString()、tupled(),而方法没有

4.scala中,函数是对象,方法可隶属于对象。说方法归属于函数,是对的

4.【结论】函数作为参数传递

示例

### 函数作为方法的参数传递

# 定义参数含函数的方法
scala> def addFunc(x:Int, f:(Int => Int)): Int = f(x) + 1
addFunc: (x: Int, f: Int => Int)Int 

# 定义函数 将作为参数传递给方法
scala> val doubleX = (x:Int) => x + x
doubleX: Int => Int = <function1>

# 调用方法 函数作为参数传给方法
scala> val a = addFunc(5, doubleX)
a: Int = 11
### 函数作为函数的参数传递

# 定义函数bF
scala> val bF = (f:(Int => Int), x:Int) => f(x) + 1
bF: (Int => Int, Int) => Int = <function2>

# 定义函数aF,将作为函数bF的参数
scala> val aF = (x:Int) => x + x
aF: Int => Int = <function1>

# 调用函数bF
scala> val z = bF(aF, 5)
z: Int = 11

5.【结论】函数作为返回值

# 函数作为方法的返回值

# 定义方法 返回值是个函数
scala> def addF(x:Int, f:(Int, Int) => Int) = (a:Int, b:Int) => x + f(a, b)
addF: (x: Int, f: (Int, Int) => Int)(Int, Int) => Int

# 定义函数 作为参数传递给方法
val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>

# 调用方法
scala> val z = addF(1, add)
z: (Int, Int) => Int = <function2> # 返回值z是个函数

# 调用z这个方法
scala> val res = z(5,6)
res: Int = 12

6.【结论】方法转函数

0.当方法作为参数时 会自动转化为函数

1.方法不能直接作为返回值,需手动将方法转为函数:
    val 函数变量名 = 方法名 _

示例

### 当方法作为方法的参数时 会自动转化为函数

# 定义方法a 将作为方法b的参数
scala> def a(x:Int, y:Int) = x + y
a: (x: Int, y: Int)Int

# 定义方法b 参数含函数
scala> def b(f:(Int, Int) => Int, x:Int, y:Int) = f(x, y)
b: (f: (Int, Int) => Int, x: Int, y: Int)Int

# 调用方法b
scala> b(a, 1, 2) # 需要函数,传入了方法a,会自动转化为函数
res15: Int = 3
### 当方法作为方法的参数时 会自动转化为函数

# 定义方法a 将作为参数传递给函数
scala> def a(x:Int, y:Int) = x + y
a: (x: Int, y: Int)Int

# 定义函数b 参数含函数
scala> val b = (f:(Int, Int) => Int, x:Int, y:Int) => f(x, y)
b: ((Int, Int) => Int, Int, Int) => Int = <function3>

# 调用函数b
scala> b(a, 1, 2) # 需要函数,传入了方法a,会自动转化为函数
res16: Int = 3
### 方法不能直接作为返回值 需手动将方法转为函数

# 定义方法
scala> def sum(n:Int, m:Int) = n + m
sum: (n: Int, m: Int)Int

# 方法转函数sumS
scala> val sumS = sum _
sumS: (Int, Int) => Int = <function2>

# 定义方法addF 返回值是函数sumS
scala> def addF() = sumS
addF: ()(Int, Int) => Int

# 调用方法addF
scala> val a = addF # 返回值是函数sumS
a: (Int, Int) => Int = <function2>

# 调用a
scala> a(1,2)
res18: Int = 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cheese海盐芝士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值