理解Scala的函数式编程思想

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Scala的函数式编程思想相关的知识,希望对你有一定的参考价值。

 ▼Scala系列学习笔记:

  1. Scala概述与开发环境配置
  2. Scala基础学习之运算符
  3. Scala基础学习之for循环和while循环
  4. 一文掌握scala中的方法和函数
  5. Scala基础:类和对象、访问修饰符和构造器
  6. Scala的继承和抽象类
  7. Scala基础语法之Trait详解
  8. Scala学习之数组与元组
  9. 大数据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的函数式编程思想的主要内容,如果未能解决你的问题,请参考以下文章

Scala函数式编程 函数式的错误处理

Scala函数式编程函数式的数据结构 下

重学scala:scala函数式编程与高阶函数

2021年大数据常用语言Scala(二十五):函数式编程 排序

Scala 基础:Scala 函数式编程基础概念定义调用机制

spark:使用java语言理解scala