Scala第十章节(函数式编程)

函数式编程

  • 所谓的函数式编程指定就是 方法的参数列表可以接收函数对象 .
  • 例如: add(10, 20)就不是函数式编程, 而 add(函数对象) 这种格式就叫函数式编程.
  • 我们将来编写Spark/Flink的大量业务代码时, 都会使用到函数式编程。下面的这些操作是学习的重点。
函数名 功能
foreach 用来遍历集合的
map 用来对集合进行转换的
flatmap 用来对集合进行映射扁平化操作
filter 用来过滤出指定的元素
sorted 用来对集合元素进行默认排序
sortBy 用来对集合按照指定字段排序
sortWith 用来对集合进行自定义排序
groupBy 用来对集合元素按照指定条件分组
reduce 用来对集合元素进行聚合计算
fold 用来对集合元素进行折叠计算

7.1 示例一:遍历(foreach)

采用 foreach 来遍历集合, 可以让代码看起来更简洁, 更优雅.

格式
scala 复制代码
def foreach(f:(A) => Unit): Unit
//简写形式
def foreach(函数)
说明
foreach API 说明
参数 f: (A) ⇒ Unit 接收一个函数对象, 函数的参数为集合的元素,返回值为空
返回值 Unit 表示foreach函数的返回值为: 空
执行过程
需求

有一个列表,包含以下元素1,2,3,4,请使用foreach方法遍历打印每个元素

参考代码
scala 复制代码
//案例: 演示foreach函数
object ClassDemo23 {
def main(args: Array[String]): Unit = {
//1. 定义一个列表, 包含1, 2, 3, 4
val list1 = List(1, 2, 3, 4)
//2. 通过foreach函数遍历上述的列表.
//x:表示集合中的每个元素 函数体表示输出集合中的每个元素.
list1.foreach((x:Int) => println(x))
}
}

7.2 示例二:简化函数定义

概述

上述案例函数定义有点啰嗦,我们有更简洁的写法。可以通过如下两种方式来简化函数定义:

  • 方式一: 通过 类型推断 来简化函数定义.

解释:

​ 因为使用foreach来迭代列表,而列表中的每个元素类型是确定的, 所以我们可以通过 类型推断 让Scala

​ 程序来自动推断出来集合中每个元素参数的类型, 即: 在我们创建函数时,可以省略其参数列表的类型.

  • 方式二: 通过 下划线 来简化函数定义.

解释:

​ 当函数参数,只在函数体中出现一次,而且函数体没有嵌套调用时,可以使用下划线来简化函数定义.

示例
  1. 有一个列表,包含元素1,2,3,4,请使用foreach方法遍历打印每个元素.

  2. 使用类型推断来简化函数定义.

  3. 使用下划线来简化函数定义

参考代码
scala 复制代码
//案例: 演示简化函数定义.
object ClassDemo24 {
def main(args: Array[String]): Unit = {
//1. 有一个列表,包含元素1,2,3,4,请使用foreach方法遍历打印每个元素.
val list1 = List(1, 2, 3, 4)
list1.foreach((x:Int) => println(x))
println("-" * 15)
//2. 使用类型推断来简化函数定义.
list1.foreach(x => println(x))
println("-" * 15)
//3. 使用下划线来简化函数定义
list1.foreach(println(_))
}
}

7.3 实例三:映射(map)

集合的映射操作是指 将一种数据类型转换为另外一种数据类型的过程 , 它是在进行数据计算的时候, 甚至将来在编写

Spark/Flink程序时用得最多的操作,也是我们必须要掌握的.

例如: 把List[Int]转换成List[String].

格式
scala 复制代码
def map[B](f: (A) ⇒ B): TraversableOnce[B]
//简写形式:
def map(函数对象)
说明
map方法 API 说明
泛型 [B] 指定map方法最终返回的集合泛型, 可省略不写.
参数 f: (A) ⇒ B 函数对象, 参数列表为类型A(要转换的列表元素),返回值为类型B
返回值 TraversableOnce[B] B类型的集合, 可省略不写.
执行过程
需求
  1. 创建一个列表,包含元素1,2,3,4
  2. 将上述的数字转换成对应个数的 * , 即: 1变为*, 2变为**, 以此类推.
参考代码
scala 复制代码
//案例: 演示map函数(映射)
object ClassDemo25 {
def main(args: Array[String]): Unit = {
//1. 创建一个列表,包含元素1,2,3,4
val list1 = List(1, 2, 3, 4)
//2. 将上述的数字转换成对应个数的`*`, 即: 1变为*, 2变为**, 以此类推.
//方式一: 普通写法
val list2 = list1.map((x:Int) => "*" * x)
println(s"list2: ${list2}")
//方式二: 通过类型推断实现.
val list3 = list1.map(x => "*" * x)
println(s"list3: ${list3}")
//方式三: 通过下划线实现.
val list4 = list1.map("*" * _)
println(s"list4: ${list4}")
}
}

7.4 示例四: 扁平化映射(flatMap)

扁平化映射可以理解为先map ,然后再flatten , 它也是将来用得非常多的操作,也是必须要掌握的, 如图:

解释:

  1. map是将列表中的元素转换为一个List
  2. flatten再将整个列表进行扁平化
格式
scala 复制代码
def flatMap[B](f:(A) => GenTraversableOnce[B]): TraversableOnce[B]
//简写形式:
def flatMap(f:(A) => 要将元素A转换成的集合B的列表)
说明
flatmap方法 API 说明
泛型 [B] 最终要返回的集合元素类型, 可省略不写.
参数 f: (A) ⇒ GenTraversableOnce[B] 传入一个函数对象 函数的参数是集合的元素 函数的返回值是一个集合
返回值 TraversableOnce[B] B类型的集合
需求
  1. 有一个包含了若干个文本行的列表:"hadoop hive spark flink flume", "kudu hbase sqoop storm"
  2. 获取到文本行中的每一个单词,并将每一个单词都放到列表中.
思路分析
参考代码
scala 复制代码
//案例: 演示映射扁平化(flatMap)
object ClassDemo26 {
def main(args: Array[String]): Unit = {
//1. 有一个包含了若干个文本行的列表:"hadoop hive spark flink flume", "kudu hbase sqoop
storm"
val list1 = List("hadoop hive spark flink flume", "kudu hbase sqoop storm")
//2. 获取到文本行中的每一个单词,并将每一个单词都放到列表中.
//方式一: 通过map, flatten实现.
val list2 = list1.map(_.split(" "))
val list3 = list2.flatten
println(s"list3: ${list3}")
//方式二: 通过flatMap实现.
val list4 = list1.flatMap(_.split(" "))
println(s"list4: ${list4}")
}
}
相关推荐
代码匠心21 小时前
从零开始学Flink:Flink SQL四大Join解析
大数据·flink·flink sql·大数据处理
武子康2 天前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB3 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康3 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
IvanCodes3 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康4 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
字节跳动数据平台5 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康5 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
字节跳动数据平台6 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
得物技术6 天前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark