《快学Scala》第12章——高阶函数 学习笔记

Scala混合了面向对象和函数式的特性。在函数式编程语言中,函数时“头等公民”,可以像任何其他类型一样被传递和操作;只需要将明细动作包含在函数当中作为参数传入即可。
本章要点概述:

  • 在Scala中函数时“头等公民”,就和数字一样。
  • 可以创建匿名函数,通常还会把它们交给其他函数。
  • 函数参数可以给出需要稍后执行的行为。
  • 许多集合方法都接受函数参数,将函数应用到集合中的值里面。
  • 有许多语法上的简写以简短且易读的方式表达函数参数。
  • 可以创建操作代码块的函数,它们看上去就像是內建的控制语句。

12.1 作为值的函数

在Scala中,可以在变量中存放函数:

import scala.math._

val num = 3.14
val fun = ceil _    //将fun设为ceil函数
fun(num)    //调用fun中的函数,返回值为4.0
Array(3.14, 1.42, 2.0).map(fun) 

上面的代码中,将fun设为ceil函数。ceil函数后的意味着确实指的是这个函数,而不是碰巧忘记了给它传送参数。如果不带会出错。

scala> import scala.math._
import scala.math._

scala> val num = 3.14
num: Double = 3.14

scala> val fun = ceil _
fun: Double => Double = <function1>

scala> val fun = ceil 
<console>:10: error: missing arguments for method ceil in class MathCommon;
follow this method with `_' if you want to treat it as a partially applied function
       val fun = ceil 

scala> fun(num)
res0: Double = 4.0
scala> Array(3.14, 1.42, 2.0).map(fun)
res1: Array[Double] = Array(4.0, 2.0, 2.0)

说明:从技术上讲, _将ceil方法转成了函数。在Scala中,无法直接操纵方法,而只能直接操纵函数。
函数的用处:

  • 调用它;
  • 传递它,存放在变量中,或者作为参数传递给另一个函数。
    如何将fun传递给另一个函数:
    Array(3.14, 1.42, 2.0).map(fun)
    map方法接受一个函数参数,将它应用到数组中的所有值,然后返回结果的数组。

12.2 匿名函数

在Scala中,不需要给每一个函数命名,正如不需要给每个数字命名一样。以下是一个命名函数:

(x: Double) => 3 * x  //该函数将传给它的参数乘以3
val triple = (x: Double) => 3 * x //将函数存放在变量中
def triple(x: Double) = 3 * x  //跟def一样
Array(3.14, 1.42, 2.0).map((x:Double) => 3 * x)
//不需要给函数命名,可以直接将其传递给另一个函数,结果为Array(9.42, 4.26, 6.0)
//上一条语句也可以写成中置表达式的方格(不需要加句点):Array(3.14, 1.42, 2.0) map ((x:Double) => 3 * x)

12.3 带函数参数的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

love666666shen

谢谢您的鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值