Scala之旅-高阶函数(HIGHER-ORDER FUNCTIONS)

2024-01-13 07:32

本文主要是介绍Scala之旅-高阶函数(HIGHER-ORDER FUNCTIONS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

高阶函数是把其它函数当作参数或者返回一个函数作为结果。这是可以重点内容的,因为在 Scala 中函数是最优先的值。在这点上,术语可能会令人困惑,我们使用术语”高阶函数“来表示那些把函数作为参数函数作为返回结果的方法和函数。
其中最常见的例子之一,就是 Scala 中可用于集合的高阶函数 map

val salaries = Seq(20000, 70000, 40000)
val doubleSalary = (x: Int) => x * 2
val newSalaries = salaries.map(doubleSalary) // List(40000, 140000, 80000)

doubleSalary 函数有一个 Int 类型的参数 x ,并返回 x * 2 。通常,箭头 => 左侧的元组(tuple)是一个参数列表,右侧表达式的计算结果就是返回值。在第三行代码中,doubleSalary 函数被应用到 salaries 列表的每一个元素上。
为了缩短代码,我们可以使用匿名函数并直接将它作为参数传递给 map。

val salaries = Seq(20000, 70000, 40000)
val newSalaries = salaries.map(x => x * 2) // List(40000, 140000, 80000)

注意,在上面的例子中,x 没有被声明为 Int 型。那是因为编译器可以根据函数映射模型推断出 x 的类型。
编写相同代码更加符合习惯的方式是:

val salaries = Seq(20000, 70000, 40000)
val newSalaries = salaries.map(_ * 2)

因为 Scala 已经知道了参数的类型(单 Int 类型),所以你只需提供函数的右半部分。唯一需要注意的就是你要使用 _ 代替参数名称。(例如上面例子中的 x )

方法强制转换为函数

可以将方法作为参数传入到高阶函数中,因为 Scala 编译器会将该方法强制转化为函数。

case class WeeklyWeatherForecast(temperatures: Seq[Double]) {private def convertCtoF(temp: Double) = temp * 1.8 + 32def forecastInFahrenheit: Seq[Double] = temperatures.map(convertCtoF) // <-- passing the method convertCtoF
}

这里的 convertCtoF 方法被传递给了 forecastInFahrenheit。 因为编译器将 convertCtoF 方法强制转换为函数 x => convertCtoF(x) (注意: x 将是一个能够保证在它的作用域内是唯一的名字 )

接收函数的函数

使用高阶函数的一个原因是为了减少冗余代码。如果你想要根据不同原因提高某人薪水。不使用高阶函数,你可能会这样写:

object SalaryRaiser {def smallPromotion(salaries: List[Double]): List[Double] =salaries.map(salary => salary * 1.1)def greatPromotion(salaries: List[Double]): List[Double] =salaries.map(salary => salary * math.log(salary))def hugePromotion(salaries: List[Double]): List[Double] =salaries.map(salary => salary * salary)
}

注意三个方法中的每一个是如何根据乘法因子变化的。简化点,你可以将上面重复的代码抽取到一个高阶函数中,就像下面这样:

object SalaryRaiser {private def promotion(salaries: List[Double], promotionFunction: Double => Double): List[Double] =salaries.map(promotionFunction)def smallPromotion(salaries: List[Double]): List[Double] =promotion(salaries, salary => salary * 1.1)def bigPromotion(salaries: List[Double]): List[Double] =promotion(salaries, salary => salary * math.log(salary))def hugePromotion(salaries: List[Double]): List[Double] =promotion(salaries, salary => salary * salary)
}

返回函数的函数

这里有几个想生成函数的例子。下面是一个返回函数的方法的例子。

def urlBuilder(ssl: Boolean, domainName: String): (String, String) => String = {val schema = if (ssl) "https://" else "http://"(endpoint: String, query: String) => s"$schema$domainName/$endpoint?$query"
}
val domainName = "www.example.com"
def getURL = urlBuilder(ssl=true, domainName)
val endpoint = "users"
val query = "id=1"
val url = getURL(endpoint, query) // "https://www.example.com/users?id=1": String

这里写图片描述

注意 urlBuilder 方法的返回类型 (String, String) => String 。这表示返回的匿名函数携带两个字符串参数并返回一个字符串。在这个例子中,返回的匿名函数是 (endpoint: String, query: String) => s"https://www.example.com/$endpoint?$query"

备注def getURL = urlBuilder(ssl=true, domainName) 这行代码表示将 urlBuilder 返回的匿名函数命名为 getURL 方法。

这篇关于Scala之旅-高阶函数(HIGHER-ORDER FUNCTIONS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/600674

相关文章

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段