Scala 符号 => 的用法(匿名函数(x:Int)=>x+1)

本文介绍了Scala中的函数类型、匿名函数、ByName参数及case语句的使用方法,并提供了具体的示例代码,帮助读者理解这些概念及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large][color=red][b]1. 表示函数的类型(Function Type)[/b][/color][/size]


def getMap(f:(Int)=>Int,m:Int,n:Int)={
val list = m to n
list.map(x=>(x,f(x))).foreach(println _)
}

getMap((x:Int)=>x*x,-5,5)



def double(x: Int): Int = x*2


[color=blue][b]函数double的类型就是 (x: Int) => Int 或者 Int => Int[/b][/color]

备注: [b]当函数只有一个参数的时候,函数类型里面括起来函数参数的括号是可以省略的。[/b]

使用函数的类型,就可以定义函数变量(Function Value/Function Variable)

那么现在定义一个函数变量:

var x : (Int) => Int = double


[size=large][color=blue][b]2. 匿名函数(Anonymous functions/Function Literals/Lambda)
[/b][/color][/size]
例如:通过匿名函数定义一个函数变量xx

var xx = (x: Int) => x + 1


或者,给一个高阶函数,传递一个函数:

val newList = List(1,2,3).map { (x: Int) => x * 2 }


[b][size=large]3. By-Name Parameters[/size][/b]

假设有如下两个函数:


def doubles(x: => Int) = {
println("Now doubling " + x)
x*2
}

def f(x: Int): Int {
println(s"Calling f($i)")
i
}


[b]那么对于函数doubles而言,它的参数x就是by-name的。[/b]如果调用doubles的时候,直接给个普通的值或者非函数变量。[b]那么doubles的执行结果就跟普通的函数没有区别。[/b]但是当把一个返回值为Int类型的函数,例如f(2),传递给doubles的时候。那么f(2)会被先计算出返回值2,返回值2传入doubles参与运算。运算完成以后,f(2)会被doubles在执行以后,再调用一遍。

[size=large][color=red][b]4. case语句[/b][/color][/size]


val x = 10; val y = 20
x: Int = 10
y: Int = 20
val max = x > y match {
case true => x
case false => y
}
max: Int = 20
本关任务:定义一个柯里化函数,求两个参数的最大公约数。 相关知识 为了完成本关任务,你需要掌握: 什么是柯里化; 什么是闭包。 函数柯里化 柯里化,俗称“部分求值”。一个柯里化函数首先是会接受一些参数,但是接受这些参数之后,该函数并不会立即求值,而是继续返回另一个函数,刚才传入的参数在函数形成的闭包中被保存起来。等到函数被真正需要求值的时候,之前传入的所有参数会被一次性用于求值。也就是说,柯里化是函数式编程的一种技巧,用于把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数。 实例: 首先我们定义一个函数: def add(x:Int,y:Int)=x+y 那么我们应用的时候,应该是这样用:add(1,2)。 现在我们把这个函数变一下形: def add(x:Int)(y:Int) = x + y 那么我们应用的时候,应该是这样用:add(1)(2),最后结果都一样是 3,这种方式(过程)就叫柯里化。 实现过程: add(1)(2) 实际上是依次调用两个普通函数(非柯里化函数),第一次调用使用一个参数 x,返回一个函数类型的值,第二次使用参数 y 调用这个函数类型的值。 实质上最先演变成这样一个方法: def add(x:Int)=(y:Int)=>x+y 那么这个函数是什么意思呢? 接收一个 x 为参数,返回一个匿名函数,该匿名函数的定义是:接收一个 Int 型参数 y,函数体为 x+y。现在我们来对这个方法进行调用。 val result = add(1) 返回一个result,那 result 的值应该是一个匿名函数(y:Int)=>1+y 所以为了得到结果,我们继续调用 result。 val sum = result(2) 最后打印出来的结果就是 3。 闭包 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: val multiplier = (i:Int) => i * 10 函数体内有一个变量 i,它作为函数的一个参数。如下面的另一段代码: val multiplier = (i:Int) => i * factor 在 multiplier 中有两个变量:i 和 factor。其中的一个 i 是函数的形式参数,在 multiplier 函数被调用时,i 被赋予一个新的值。然而,factor 不是形式参数,而是自由变量,考虑下面代码: var factor = 3 val multiplier = (i:Int) => i * factor 这里我们引入一个自由变量 factor,这个变量定义在函数外面。 这样定义的函数变量 multiplier 成为一个"闭包",因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。 有意思的是,当这个自由变量发生变化时,Scala 的闭包能够捕获到这个变化,因此 Scala 的闭包捕获的是变量本身而不是当时变量的值。 同样的,如果变量在闭包在发生变化,也会反映到函数外面定义的闭包的值。比如: 可以看到在闭包中修改 sum 的值,其结果还是传递到闭包的外面。 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,计算两数的最大公约数。具体要求如下: 定义一个名为 gcd(a: Int)(b: Int) 的柯里化函数,返回值类型为 Int,计算 a、b 两数的最大公约数。 测试说明 平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 测试输入: 33 58 预期输出: 1 测试输入: 10 2 预期输出: 2
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值