理解Scala的函数式编程思想
Posted 黑马程序员官方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Scala的函数式编程思想相关的知识,希望对你有一定的参考价值。
▼Scala系列学习笔记:
- Scala概述与开发环境配置
- Scala基础学习之运算符
- Scala基础学习之for循环和while循环
- 一文掌握scala中的方法和函数
- Scala基础:类和对象、访问修饰符和构造器
- Scala的继承和抽象类
- Scala基础语法之Trait详解
- Scala学习之数组与元组
跟我一起来学习Scala函数式编程:
- 所谓的函数式编程指定就是 方法的参数列表可以接收函数对象 .
- 例如: add(10, 20)就不是函数式编程, 而 add(函数对象) 这种格式就叫函数式编程.
- 我们将来编写Spark/Flink的大量业务代码时, 都会使用到函数式编程。下面的这些操作是学习的重点。
7.1 示例一: 遍历(foreach)
采用 foreach 来遍历集合, 可以让代码看起来更简洁, 更优雅.
格式
说明
执行过程
需求
有一个列表,包含以下元素1,2,3,4,请使用foreach方法遍历打印每个元素
参考代码
7.2 示例二: 简化函数定义
概述
上述案例函数定义有点啰嗦,我们有更简洁的写法。可以通过如下两种方式来简化函数定义:
- 方式一: 通过 类型推断 来简化函数定义.
解释:
因为使用foreach来迭代列表,而列表中的每个元素类型是确定的, 所以我们可以通过 类型推断 让Scala 程序来自动推断出来集合中每个元素参数的类型, 即: 在我们创建函数时,可以省略其参数列表的类型.
- 方式二: 通过 下划线 来简化函数定义.
解释:
当函数参数,只在函数体中出现一次,而且函数体没有嵌套调用时,可以使用下划线来简化函数定义.
示例
1. 有一个列表,包含元素1,2,3,4,请使用foreach方法遍历打印每个元素.
2. 使用类型推断来简化函数定义.
3. 使用下划线来简化函数定义
参考代码
7.3 实例三: 映射(map)
集合的映射操作是指 将一种数据类型转换为另外一种数据类型的过程 , 它是在进行数据计算的时候, 甚至将来在编写 Spark/Flink程序时用得最多的操作,也是我们必须要掌握的.
例如: 把List[Int]转换成List[String].
格式
说明
执行过程
需求
- 1. 创建一个列表,包含元素1,2,3,4
- 2. 将上述的数字转换成对应个数的 * , 即: 1变为*, 2变为**, 以此类推.
参考代码
7.4 示例四: 扁平化映射(flflatMap)
扁平化映射可以理解为先map,然后再flflatten, 它也是将来用得非常多的操作,也是必须要掌握的, 如图:
解释:
1. map是将列表中的 元素转换为一个List
2. flflatten再将整个列表进行扁平化
格式
说明
示例
需求
- 1. 有一个包含了若干个文本行的列表:"hadoop hive spark flflink flflume", "kudu hbase sqoop storm"
- 2. 获取到文本行中的每一个单词,并将每一个单词都放到列表中.
思路分析
参考代码
7.5 示例五: 过滤(fifilter)
过滤指的是 过滤出(筛选出)符合一定条件的元素 .
格式
说明
执行过程
案例
1. 有一个数字列表,元素为:1,2,3,4,5,6,7,8,9
2. 请过滤出所有的偶数
参考代码
7.6 示例六: 排序
在scala集合中,可以使用以下三种方式来进行排序
7.6.1 默认排序(sorted)
所谓的默认排序指的是 对列表元素按照升序进行排列 . 如果需要降序排列, 则升序后, 再通过 reverse 实现.
需求
1. 定义一个列表,包含以下元素: 3, 1, 2, 9, 7
2. 对列表进行升序排序
3. 对列表进行降序排列.
参考代码
7.6.2 指定字段排序(sortBy)
所谓的指定字段排序是指 对列表元素根据传入的函数转换后,再进行排序 .
例如: 根据列表List("01 hadoop", "02 flflume")的 字母进行排序.
格式
说明
示例
- 1. 有一个列表,分别包含几下文本行:"01 hadoop", "02 flflume", "03 hive", "04 spark"
- 2. 请按照单词字母进行排序
参考代码
7.6.3 自定义排序(sortWith)
所谓的自定义排序指的是 根据一个自定义的函数(规则)来进行排序 .
格式
说明
示例
1. 有一个列表,包含以下元素:2,3,1,6,4,5
2. 使用sortWith对列表进行降序排序
参考代码
7.7 示例七: 分组(groupBy)
分组指的是 将数据按照指定条件进行分组 , 从而方便我们对数据进行统计分析.
格式
说明
执行过程
需求
- 1. 有一个列表,包含了学生的姓名和性别: "刘德华" -> "男", "刘亦菲" -> "女", "胡歌" -> "男"
- 2. 请按照性别进行分组.
- 3. 统计不同性别的学生人数.
参考代码
7.8 示例八: 聚合操作
所谓的聚合操作指的是 将一个列表中的数据合并为一个 . 这种操作经常用来统计分析中. 常用的聚合操作主要有两个:
- reduce: 用来对集合元素进行聚合计算
- fold: 用来对集合元素进行折叠计算
7.8.1 聚合(reduce)
reduce表示将列表传入一个函数进行聚合计算.
格式
说明
执行过程
注意:
reduce和reduceLeft效果一致,表示从左到右计算
reduceRight表示从右到左计算
需求
1. 定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
2. 使用reduce计算所有元素的和
参考代码
7.8.2 折叠(fold)
fold与reduce很像,只不过多了一个指定初始值参数.
格式
说明
注意事项:
fold和foldLet效果一致,表示从左往右计算
foldRight表示从右往左计算
需求
1. 定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
2. 假设初始化值是100, 使用fold方法计算所有元素的和.
参考代码
以上是关于理解Scala的函数式编程思想的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据常用语言Scala(二十五):函数式编程 排序