Scala函数式编程

本文深入探讨了Scala中的函数式编程,通过多个案例详细介绍了遍历、简化函数定义、映射、扁平化映射、过滤、排序、分组和聚合操作。这些概念在Spark/Flink等大数据处理框架中广泛应用,对于提升代码质量和效率至关重要。
摘要由CSDN通过智能技术生成

目录

函数式编程

案例一:遍历(foreach)

案例二:简化函数定义

案例三:映射

案例四:扁平化映射(flatMap)

案例五:过滤(filter)

案例六:排序

默认排序(sorted)

指定字段排序(sortBy)

自定义排序

案例七:分组

案例八:聚合操作

聚合

折叠(fold)

综合案例(学生成绩单)


函数式编程

函数式编程指定就是方法的参数列表可以接收函数对象

例如:add(10,20)就不是函数式编程,而add(函数对象)这种格式就叫做函数式编程

我们将来编写Spark/Flink的大量业务代码的时候,都会使用到函数式编程

函数名 功能
foreach 用来遍历集合的
map 用来对集合进行转换的
flatmap 用来对集合进行映射扁平化操作的
filter 用来过滤出指定元素
sorted 用来对集合元素进行默认排序
sortBy 用来对集合按照指定字段排序
sortwith 用来对集合进行自定义排序
groupby 用来对集合元素按照指定条件进行分组
reduce 用来对集合元素进行聚合运算
fold 用来对集合元素进行折叠计算

案例一:遍历(foreach)

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

格式

 def foreach(f:(A)=>Unit):Unit   //括号函数体
 //简写形式
 ​
 def foreach(函数)

说明

foreach API 说明
参数 f:(A)=>Unit 接收一个函数对象,函数的参数为集合的元素,返回值为空
返回值 Unit 表示foreach函数的返回值为:空
 package test
 ​
 object Demo17 {
   def main(args: Array[String]): Unit = {
   //1.有一个列表包含以下元素1,2,3,4
     val list1=List(1,2,3,4)
   //2.使用foreach方法来遍历打印每个元素
     list1.foreach((x:Int)=>{println(x)})   //Int跟小括号可以省略
   //函数格式: (函数的参数列表)=> {函数体}   x表示列表中的每一个元素
   }
 }

案例二:简化函数定义

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

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

解释:因为使用foreach来迭代列表,而列表中的每个元素类型都属确定的,所以我们可以通过类型推断让scala程序自动推断出来集合中每个元素参数类型即:在我们创建函数时,可以省略其参数列表的类型

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

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

案例:

 package test
 ​
 object Demo17 {
   def main(args: Array[String]): Unit = {
     //1.有一个列表,包含元素1,2,3,4,5请使用foreach的方法遍历打印每一个元素
     val list1=List(1,2,3,4)
    //普通写法
     list1.foreach((x:Int)=>{println(x)})
     println("-"*20)
     //2.使用类型推断来简化函数定义
     list1.foreach(x=>println(x))
     println("-"*20)
     //3.使用下划线来简化函数定义  如果函数参数只在函数体中出现一次并且函数体未出现复杂应用嵌套之类的
     list1.foreach(println(_))
   }
 }

案例三:映射

映射就是指将一种数据类型转化为另一种数据类型的过程,它是在进行数据计算的时候,甚至将来在编写Spark/Flink程序时用得最多的操作,也是我们必须要掌握的

格式

 def map[B](f:(A)=>B): TraversableOnce[B]
 ​
 //简写形式
 def map(函数对象)
 ​

说明

map方法 API 说明
泛型 [B] 指定map方法最终返回的集合泛型,可省略不写
参数 f:(A)=>B 函数对象,参数列表为类型A(要转换的列表元素),返回值为类型B
返回值 TraversableOnce[B] B类型的集合,可省略不写
 package test
 ​
 object Demo17 {
   def main(args: Array[String]): Unit = {
     //创建一个列表包含元素:1,2,3,4
     val list1=List(1,2,3,4)
     //将上述数字转换成对应个数的*,即: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}")
   }
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panxiaohu2222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值