跟连乐一起学Scala-高阶函数

本文深入探讨了Scala中的高阶函数概念,包括函数作为值的使用、匿名函数、带函数参数的函数、柯里化及闭包等内容,并通过具体实例展示了如何在实际编程中运用这些高级特性。
高阶函数

作为值的函数

Scala中,函数是”头等公民

import scala.math._
val num = 3.14
val fun = ceil _

对于函数,你能做什么呢?

  1. 调用它
  2. 传递它,存放在变量中,或者作为参数传递给另一个函数。

调用示例:

fun(num) //

传递示例:

Array(3.14, 1.43, 2.0).map(fun)

匿名函数

Scala中,你无需给每一个函数命名。

(x: Double) => 3 * x  //该函数将传给它的参数乘以3

当然,可以将这个函数存放在变量中:

val triple = (x: Double) => x * 3
//等价于
def triple(x: Double) = 3 * x

但是,这样,更简单些,举例:

Array(3.14, 1.43, 2.0).map((x: Double) => x * 2)
//Array(6.28, 2.85, 4.0)

带函数参数的函数

def valueAtOneQuarter(f: (Double) => Double) = f(0.25) 

//此函数接受Double类型并返回Double类型。

高阶函数示例:

def mulBy(factor: Double) = (x: Double) => factor * x
//举例:mulBy(3)返回函数:(x: Double) => 3 * x
val quintuple = mulBy(5)
quintuple(20)  //100

参数(类型)推断

valueAtOneQuarter((x: Double) => 3 * x)

//由于上面这个方法知道你会传入一个Double类型的函数,故,简化为:
valueAtOneQuater((x) => x * 3)

//作为额外奖励:对于只有一个参数的函数,你可以略去参数外围的括号:
valueAtOneQuarter(x => x * 3)

//如果参数在=>右侧只出现一次,那么可以用_替换掉它:
valueAtOneQuarter(3 * _)

一些有用的高阶函数
1.map

(1 to 9).map(0.1 * _)
//产生0.1,0.2,0.3...0.9的集合

2.filter方法输出所有匹配某个特定条件的元素。

(1 to 9).filter(_ % 2 == 0) //2, 4, 6, 8
  1. reduceLeft()方法接受一个二元的函数–即一个带有两个参数的函数–并将它应用到序列中的所有元素,从左到右。
(1 to 9).reduceLeft(_ * _)
//等价于:
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9

4.sortWith

"Marry has a little lamb".split(" ").sortWith(_.length < _.length)

//Array("a", "had", "Mary", "lamb", "little")

闭包

Scala中,你可以在任何作用域内定义函数:包,类,甚至是另一个函数或方法。
在函数体内,你可以访问到相应作用域内的任何变量。


SAM转换

Scala中,每当你想要告诉另一个函数做某件事时,你都会传给一个函数参数给它。

var counter = 0

val button = new JButton("Increment")
button.addActionListener(new ActionListener{
    override def actionPerformed(event: ActionEvent) {
        counter += 1
    }
})

转换为:

inplicit def makeAction(action: (ActionEvent) => Unit) =
    new ActionListener {
        override def actionPerformed(event: ActionEvent) {
            action(event)
    }
}

柯里化

将原来接受两个参数的函数变成新的接受一个参数的函数的过程。

def mul(x: Int, y: Int) = x * y

//柯里化后:
def mulOneAtATime(x: Int) (y: Int) = x * y

控制抽象

我们可以将一系列语句组成不带参数也没有返回值的函数。

def runINThread(block: () => Unit) {
    new Thread {
    override def run() {block()}
    }.start()
}

//等价于:
def runINThread(block: => Unit) {
    new Thread {
    override def run() {block()}
    }.start()
}

return表达式

Scala中你不需要用return语句来返回函数的值。
函数的返回值就是函数体的值。

当然,你可以用return来从一个匿名函数中返回值给包含这个匿名函数的带名函数。

def indexOf(str: String, ch: Char): Int = {
    var i = 0
    until (i == str.length) {
        if (str(i) == ch) return i
        i += 1
    }
    return -1
} 
内容概要:本文详细阐述了车载以太网通信栈中两个核心模块——以太网接口(EthIf)与以太网驱动(Eth)的功能需求与技术规范。重点介绍了EthIf在上下层协议间的数据转发、硬件抽象、VLAN支持、PDU配置、队列调度、睡眠管理及性能计数器等方面的设计要求;同时深入描述了Eth模块在硬件初始化、工作模式切换、时间戳支持、DMA传输、流量整形与调度、帧抢占等底层驱动功能的技术实现要点。整体围绕车载高可靠性、低延迟、可配置性强的通信需求展开,体现了现代汽车电子架构对高性能网络通信的支持能力。; 适合人群:从事汽车电子、车载网络通信、ECU开发的工程师,尤其是熟悉AUTOSAR架构并希望深入了解以太网协议栈底层机制的研发人员;具备一定嵌入式系统和网络通信基础的技术人员。; 使用场景及目标:①用于设计和实现符合车规级要求的以太网通信栈;②理解EthIf与Eth在车载网络中的角色分工与协作机制;③掌握中断/轮询模式、VLAN处理、时间同步、流量调度、帧抢占等关键技术在实际系统中的应用;④支持高实时性应用场景如自动驾驶、多传感器融合等的网络架构设计。; 阅读建议:建议结合AUTOSAR标准文档及相关硬件手册进行对照习,重点关注模块接口定义与状态机行为,结合实际项目需求进行配置与验证,并注意软硬件协同设计中的时序与资源管理问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值