目录

高阶函数用法

作为值的函数

匿名函数

柯里化(多参数列表)

闭包


高阶函数用法

Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是“头等公民”,它和Int、String、Class等其他类型处于同等的地位,可以像其他任何数据类型一样被传递和操作。

高阶函数包含:作为值的函数、匿名函数、闭包、柯里化等等。

作为值的函数

在scala中,函数就像和数字、字符串一样,可以将函数传递给一个方法。我们可以对算法进行封装,然后将具体的动作传递给算法,这种特性很有用。

我们之前学习过List的map方法,它就可以接收一个函数,完成List的转换。

示例:将一个小数列表中的每个元素转换为对应个数的小星星

List(1, 2, 3...) => *, \, \

代码:

val list = List(1, 2, 3, 4)// 字符串*方法,表示生成指定数量的字符串
val func_num2star = (num:Int) => "*" * numprint(list.map(func_num2star))

匿名函数

上面的代码,给(num:Int) => "*" * num函数赋值给了一个变量,但是这种写法有一些啰嗦。在scala中,可以不需要给函数赋值给变量,没有赋值给变量的函数就是匿名函数

示例:优化上述代码

val list = List(1, 2, 3, 4)list.map(num => "*" * num).foreach(println)
// 因为此处num变量只使用了一次,而且只是进行简单的计算,所以可以省略参数列表,使用_替代参数
list.map("*" * _).foreach(println)

柯里化(多参数列表)

list.fold(100)(_ + _)

柯里化(Currying)允许方法接收多个参数列表的语法特性。

多数用于隐式转换或者在逻辑上划分不同批次的参数用。

特点:参数如果不传递完全,得到一个函数

柯里化过程解析

使用柯里化,让传递匿名函数作为参数的语法更为简洁

示例:编写一个泛型方法,用来完成两个值类型的计算(具体的计算封装到函数中)

object CurryingDemo2 {// 实现对两个数进行计算的方法def calc[A <: AnyVal](x:A, y:A, func_calc:(A, A)=>A) = {func_calc(x, y)}// 柯里化:实现对两个数进行计算def calc_carried[A <: AnyVal](x:A, y:A)(func_calc:(A, A)=>A) = {func_calc(x, y)}def main(args: Array[String]): Unit = {// 这种写法是不能被简化的,必须要写出函数的定义println(calc(10, 10, (x:Int, y:Int)=> x + y))println(calc(10.1, 10.2, (x:Double, y:Double)=> x*y))// 柯里化之后可以快乐地使用下划线了println(calc_carried(10, 10)(_ + _))println(calc_carried(10.1, 10.2)(_ * _))println(calc_carried(100.2, 10)(_ - _))}
}

闭包

闭包其实就是一个函数,只不过这个函数的返回值依赖于声明在函数外部的变量。

可以简单认为,就是可以访问不在当前作用域范围的一个函数。

可以不修改方法体,通过外部变量来控制方法返回结果

示例:定义一个闭包

object ClosureDemo {def add(x:Int) = {val y = 10// add返回一个函数,该函数引用了add方法的一个局部变量val funcAdd = () => x + yfuncAdd}def main(args: Array[String]): Unit = {// 调用add方法时,任然可以引用到y的值// funcAdd函数就是一个闭包println(add(10)())}
}

上面的演示只是使用一个普通的int值来做的闭包。 如果依赖的外部变量是一个函数呢?

那就是,无需修改方法体, 修改外部函数就能修改计算逻辑。

2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法相关推荐

  1. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

  2. 2021年大数据常用语言Scala(三):Scala解释器

    目录 scala解释器 启动scala解释器 执行scala代码 退出解释器 scala解释器 后续我们会使用scala解释器来学习scala基本语法,scala解释器像Linux命令一样,执行一条代 ...

  3. 2021年大数据常用语言Scala(十四):基础语法学习 数组  重点掌握

    目录 数组  重点掌握 定长数组 变长数组 遍历数组 数组常用算法 数组  重点掌握 scala中数组的概念是和Java类似,可以用数组来存放一组数据.scala中,有两种数组,一种是定长数组,另一种 ...

  4. 2021年大数据常用语言Scala(四):基础语法学习 声明变量

    目录 声明变量 语法格式 在解释器中定义一个变量 val和var变量 使用类型推断来定义变量 惰性赋值 声明变量 我们将来每一天编写scala程序都会定义变量.那scala语言如何定义变量呢? 语法格 ...

  5. 2021年大数据常用语言Scala(一):Scala简介

    目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...

  6. 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

    目录 scala面向对象 MAVEN依赖 类 - 掌握 创建类和对象 - 掌握 getter/setter - 了解 类的构造器 - 掌握 scala面向对象 MAVEN依赖 <?xml ver ...

  7. 2021年大数据常用语言Scala(二):Scala开发环境安装

    目录 开发环境安装 安装JDK 安装scala SDK 步骤 具体操作 安装IDEA scala插件 步骤 开发环境安装 学习如何编写scala代码之前,需要先安装scala编译器以及开发工具 sca ...

  8. 2021年大数据常用语言Scala(十七):基础语法学习 Set

    目录 Set 不可变集 可变集 Set Set(集)是代表没有重复元素的集合.Set具备以下性质: 元素不重复 不保证插入顺序 和List正好相反, List: 元素可以重复 保证插入顺序 scala ...

  9. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

最新文章

  1. 实训3:配置网络负载平衡服务_Linux系统配置及服务管理第十四章网络管理实战2...
  2. 关于shared library的描述
  3. error C2660: 'MessageBoxA' : function does not take 4 parameters
  4. 关于Unity中的刚体和碰撞器的相关用法(一)
  5. centos6.5 搭建NFS 服务
  6. Linux之文件通信
  7. centos下离线安装mysql
  8. 阿里云获全球第一张云安全国际认证金牌
  9. 13.QT中控制台程序console相关设置
  10. 理解SQL SERVER中的分区表(转)
  11. Host 'admin-PC' is not allowed to connect to this MySQL server
  12. 导入android工程报错,eclipse导入appcompat项目报错解决办法
  13. OpenSesame免费提供新冠病毒防疫准备和远程工作培训
  14. 勒索病毒“WannaCry”之复现过程(永恒之蓝)
  15. JavaScript获取完整当前域名
  16. 互联网金融的分类监管主体
  17. 2022年上海办理EDI增值电信经营许可证年检有哪些政策
  18. 分类算法之决策树ID3详解
  19. [NOI2017]蔬菜
  20. 哈希表_实现插入、删除、查找元素操作(链地址法解决冲突)

热门文章

  1. Go 知识点(19)— Go 语言中的野指针
  2. 【JavaScript总结】JavaScript语法基础:JS高级语法
  3. 【微服务架构】SpringCloud之路由网关(zuul)
  4. 二元学习法3.0:三把学习大剑,打通学习的底层密码_学习方法
  5. NOSQL图形数据库 - Neo4j
  6. 内存接口芯片,服务器平台,PCIe 芯片
  7. OpenCL™(开放计算语言)概述
  8. 开源软硬一体OpenCV AI Kit(OAK)
  9. 编译器设计-代码优化
  10. 高精地图与自动驾驶(下)