Scala 中的函数式编程

1.遍历 (foreach)

方法

foreach(f: (A) ⇒ Unit): Unit

方法说明

foreachAPI说明
参数f: (A) ⇒ Unit接收一个函数对象
函数的输入参数为集合的元素,返回值为空
返回值Unit

代码示例

// 定义一个列表
 val a = List(1,2,3,4)
 //迭代打印
 a.foreach((x:Int)=>println(x))

在这里插入图片描述

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

使用foreach去迭代列表,而列表中的每个元素类型是确定的

  • scala可以自动来推断出来集合中每个元素参数的类型
  • 创建函数时,可以省略其参数列表的类型
代码示例
//定义一个列表
 val a = List(1,2,3,4)
 // 省略参数类型
 a.foreach(x=>println(x))

在这里插入图片描述

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

  • 当函数参数,只在函数体中出现一次,而且函数体没有嵌套调用时,可以使用下划线来简化函数定义
  • 如果方法参数是函数,如果出现了下划线,scala编译器会自动将代码封装到一个函数中
  • 参数列表也是由scala编译器自动处理
代码示例
//定义一个列表
val a = List(1,2,3,4)
//使用下划线简化函数定义
a.foreach(println(_))

在这里插入图片描述

2.映射 (map)

进行数据计算的时候,就是一个将一种数据类型转换为另外一种数据类型的过程,因此集合的映射使用的较多的操作
map方法接收一个函数,将这个函数应用到每一个元素,返回一个新的列表

方法

def map[B](f: (A) ⇒ B): TraversableOnce[B]

方法说明

map方法API说明
泛型[B]指定map方法最终返回的集合泛型
参数f: (A) ⇒ B传入一个函数对象
该函数接收一个类型A(要转换的列表元素),返回值为类型B
返回值TraversableOnce[B]B类型的集合

代码示例

//1. 创建一个列表,包含元素1,2,3,4
val a = List(1,2,3,4)
//2. 对List中的每一个元素加1
a.map(x=>x+1)
//3.使用下划线来定义函数,对List中的每一个元素加1
a.map(_ + 1)

在这里插入图片描述

3.映射扁平化(flatmap)

定义

可以把flatMap,理解为先map,然后再flatten

  • map是将列表中的元素转换为一个List
  • flatten再将整个列表进行扁平化

方法

def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): TraversableOnce[B]

方法说明

flatmap方法API说明
泛型[B]最终要转换的集合元素类型
参数f: (A) ⇒ GenTraversableOnce[B]传入一个函数对象
函数的参数是集合的元素
函数的返回值是一个集合
返回值TraversableOnce[B]B类型的集合

代码示例

//一个文本中包含了若干行,创建一个列表保存这若干行
//"hadoop hive spark flink flume", "kudu hbase sqoop storm"
//获取到文本中每一行中的每一个单词,并将每一个单词都放到列表中
// 定义文本行列表
val a = List("hadoop hive spark flink flume", "kudu hbase sqoop storm")
//使用map将文本行转换为单词数组
 a.map(x=>x.split(" "))
 // 将数组中的扁平化
 a.map(x=>x.split(" ")).flatten

在这里插入图片描述

使用flatMap简化操作

代码示例
// 定义文本行列表
val a = List("hadoop hive spark flink flume", "kudu hbase sqoop storm")
//获取到文本中每一行中的每一个单词,并将每一个单词都放到列表中
a.flatMap(_.split(" "))

在这里插入图片描述

4.过滤(filter)

过滤符合一定条件的元素

方法

def filter(p: (A) ⇒ Boolean): TraversableOnce[A]

方法说明

filter方法API说明
参数p: (A) ⇒ Boolean传入一个函数对象
接收一个集合类型的参数
返回布尔类型,满足条件返回true, 不满足返回false
返回值TraversableOnce[A]列表

代码示例

//1. 有一个数字列表,元素为:1,2,3,4,5,6,7,8,9  
//过滤出所有的偶数

 List(1,2,3,4,5,6,7,8,9).filter(_ % 2 == 0)

5.是否存在(exists)

方法

def exists(p: (A) ⇒ Boolean): Boolean

方法说明

对集合中的元素进行某个判断,其中之一符合条件则返回true,反之返回false

//1. 有一个数字列表,元素为:1,2,3,4,5,6,7,8,9  

//判断这个数字列表是否有小于 1 的存在
 List(1,2,3,4,5,6,7,8,9).exists(_ < 1)
 //判断这个数字列表是否有大于 1 的存在
 List(1,2,3,4,5,6,7,8,9).exists(_ > 5)

在这里插入图片描述

6.排序(sorted、sortBy、sortWith)

在scala集合中,可以使用以下几种方式来进行排序

  • sorted默认排序
  • sortBy指定字段排序
  • sortWith自定义排序

默认排序(升序) (sorted)

代码示例
//1.定义一个列表,包含以下元素: 3, 1, 2, 9, 7
//2.对列表进行升序排序
List(3,1,2,9,7).sorted

在这里插入图片描述

指定字段排序 (sortBy)

根据传入的函数转换后,再进行排序

方法
def sortBy[B](f: (A) ⇒ B): List[A]
方法说明
sortBy方法API说明
泛型[B]按照什么类型来进行排序
参数f: (A) ⇒ B传入函数对象
接收一个集合类型的元素参数
返回B类型的元素进行排序
返回值List[A]返回排序后的列表
代码示例
//1. 有一个列表,分别包含几行文本的内容:"01 hadoop", "02 flume", "03 hive", "04 spark"
//2. 请按照单词字母进行排序
val a = List("01 hadoop", "02 flume", "03 hive", "04 spark")
//按空格切分,以切分后的第二个元素进行排序
a.sortBy(_.split(" ")(1))

自定义排序 (sortWith)

自定义排序,根据一个函数来进行自定义排序

方法
def sortWith(lt: (A, A) ⇒ Boolean): List[A]
方法说明
sortWith方法API说明
参数lt: (A, A) ⇒ Boolean传入一个比较大小的函数对象
接收两个集合类型的元素参数
返回两个元素大小,小于返回true,大于返回false
返回值List[A]返回排序后的列表
代码示例
//1. 有一个列表,包含以下元素:2,3,1,6,4,5
val a = List(2,3,1,6,4,5)
//2. 使用sortWith对列表进行降序排序
a.sortWith((x,y) => if(x>y)true else false)
//函数参数只在函数中出现一次,可以使用下划线代替
a.sortWith(_ > _)

在这里插入图片描述

7.分组(groupBy)

我们如果要将数据按照分组来进行统计分析,就需要使用到分组方法
groupBy表示按照函数将列表分成不同的组

方法

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]

方法解析

groupBy方法API说明
泛型[K]分组字段的类型
参数f: (A) ⇒ K传入一个函数对象
接收集合元素类型的参数
返回一个K类型的key,这个key会用来进行分组,相同的key放在一组中
返回值Map[K, List[A]]返回一个映射,K为分组字段,List为这个分组字段对应的一组数据

代码示例

//有一个列表,包含了学生的姓名和性别(0代表男 1 代表女):  
//"zhangsan","0"   "lisi","1"  "wangwu","0"
//请按照性别进行分组,统计不同性别的学生人数

//定义一个元组列表来保存学生姓名和性别
val a = List("zhangsan"-> "0", "lisi"->"1", "wangwu"->"0")
//按照性别进行分组 
val b = a.groupBy(_._2)
// 将分组后的映射转换为性别/人数元组列表	
 b.map(x => x._1 -> x._2.size)

8.聚合计算(reduce)

聚合操作,可以将一个列表中的数据合并为一个。这种操作经常用来统计分析中
reduce表示将列表,传入一个函数进行聚合计算

  • reduce和reduceLeft效果一致,表示从左到右计算
  • reduceRight表示从右到左计算

方法

def reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1

方法说明

reduce方法API说明
泛型[A1 >: A](下界)A1必须是集合元素类型的子类
参数op: (A1, A1) ⇒ A1传入函数对象,用来不断进行聚合操作
第一个A1类型参数为:当前聚合后的变量
第二个A1类型参数为:当前要进行聚合的元素
返回值A1列表最终聚合为一个元素

代码示例

//定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
val a = List(1,2,3,4,5,6,7,8,9,10)

// 第一个下划线表示第一个参数,就是历史的聚合数据结果
// 第二个下划线表示第二个参数,就是当前要聚合的数据元素
//使用reduce计算所有元素的和
a.reduce(_ + _)
// 与reduce一样,从左往右计算
a.reduceLeft(_ + _)
// 从右往左聚合计算
 a.reduceRight(_ + _)

在这里插入图片描述

9.折叠(fold)

fold与reduce很像,但是多了一个指定初始值参数

  • fold和foldLet效果一致,表示从左往右计算
  • foldRight表示从右往左计算

方法

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1

方法说明

reduce方法API说明
泛型[A1 >: A](下界)A1必须是集合元素类型的子类
参数1z: A1初始值
参数2op: (A1, A1) ⇒ A1传入函数对象,用来不断进行折叠操作
第一个A1类型参数为:当前折叠后的变量
第二个A1类型参数为:当前要进行折叠的元素
返回值A1列表最终折叠为一个元素

代码示例

//定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
val a = List(1,2,3,4,5,6,7,8,9,10)
//使用fold方法计算所有元素的和
a.fold(0)(_ + _)
a.foldLeft(0)(_ + _)
a.foldRight(0)(_ + _)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Scala函数编程》是一本非常实用的Scala编程书籍,旨在教读者如何使用Scala编程语言实现函数编程。该书通过具体的实例和案例来阐述Scala函数编程的核心概念和技术,包括函数编程基础、函数的高阶抽象、类型系统、模匹配、并发编程、I/O 和异常处理等方面内容。这些知识点包含了Scala编程语言的重要概念,可以帮助读者深入掌握Scala函数编程的技术,并在实际应用运用它们。此外,该书也涵盖了Scala代码风格和整洁性等方面,对编成良好的代码有很大的帮助。总之,这本书对于学习Scala函数编程的人来说是非常有实践价值的一本书籍。 ### 回答2: Scala函数编程的PDF是一本非常有价值的学习资料。对于想要深入学习Scala函数编程的开发者,这本书提供了全面详尽的指导和实践经验,帮助开发者理解函数编程的核心概念和思想,并将其应用于Scala程序开发。 该书主要包括以下内容: 1.函数编程的基本概念和原则,如不可变性、高阶函数、currying、尾递归等等。 2.函数数据结构和算法的实现,包括列表、栈、队列、树、图等等。 3.如何使用Scala语言支持函数编程的特性,如case class、模匹配、参数化类型、协变和逆变等等。 4.如何使用Scala函数编程框架,如Akka、Spark等来构建高效的分布应用。 这本书主要适合已经有一定Scala编程基础或者其他函数编程语言经验的开发者阅读,由于书的内容较为深入和专业,对于初学者不太友好。但对于有一定基础的Scala开发者来说,该书是一本非常有价值的参考资料,可以帮助他们更深入地理解Scala函数编程,提高代码质量和开发效率。 ### 回答3: Scala是一种支持函数编程编程语言,从而满足了编程语言发展对于高度抽象和复杂数据处理的需求。Scala函数编程pdf是一个学习Scala函数编程理论和实践的重要资源。 Scala函数编程pdf包含Scala函数编程核心概念和技术,例如高阶函数、不可变性、模匹配和递归等。它还涵盖了Scala函数编程的一些常见问题和解决方案,以及Scala函数编程如何与面向对象编程 (OOP)相融合等。 Scala函数编程pdf还提供了丰富的实际案例,包括使用Scala函数编程技术实现算法、数据处理、Web应用程序、分布编程等等。 总之,Scala函数编程pdf是Scala程序员学习和实践函数编程的重要资源,它提供了理论、实践和案例相结合的综合性学习体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值