Scala函数式编程学习,简单案例
函数式编程
- 所谓的函数式编程指定的式 方法的参数列表可以接收函数对象
- 例如:add(10,20)就不是函数式编程,add(函数对象) 这种格式就叫做函数式编程
- 我们将来编写Spark/Flink大量业务代码时,都会使用到函数式编程。下面的这些操作式学习的重点
函数名 | 功能 |
---|---|
foreach | 遍历集合 |
map | 对集合进行转换 |
flatmap | 进行扁平化操作 |
filtter | 过滤出指定的集合 |
sorted | 对集合元素按照默认排序 |
sortBy | 按照指定字段排序 |
sortWith | 自定义排序 |
groupBy | 按照指定条件分组 |
reduce | 聚合操作 |
fold | 折叠计算 |
foreach
案例代码
def main(args: Array[String]): Unit = {
// 定义一个列表
val list1 = List(1,2,3,4)
// 遍历每个元素,并且对每个元素进行操作,x为遍历的每个元素
list1.foreach( (x:Int) => println(x))
list1.foreach(x => println(x))
list1.foreach(println(_))
}
映射(map)
案例代码
def main(args: Array[String]): Unit = {
val list1 = List(1,2,3,4)
val test = list1.map((x:Int) => { //x=>(1,2,3,4) 遍历x
"*" * x
}) //(1,2,3,4) =>(*,**,***,****)
// 类型推断
val test1 = list1.map(a => "*" * a)
// 下划线
val test2 = list1.map("*" * _)
for (elem <- test) println(elem)
}
扁平化映射(flatMap)
先map然后再flatten
案例代码:
def main(args: Array[String]): Unit = {
// 将列表 “hadoop hive spark flink flume”,"kafka hbase sqoop storm"
// 转换成单独的单词,并且放到一个list中
val list = List("hadoop hive spark flink flume", "kafka hbase sqoop storm")
val test = list.flatMap((x:String)=>{
x.split(' ')
})
println(list)
print(test)
}
过滤(filter)
案例代码:
def main(args: Array[String]): Unit = {
// 过滤数字列表中的偶数:
// List(1,2,3,4,5,6,7,8,9)
val list1 = List(1,2,3,4,5,6,7,8,9)
val list2 = list1.filter(_%2!=0)
println(list2)
}
排序
1. 默认排序(sorted)
案例代码:
def main(args: Array[String]): Unit = {
// 定义一个列表,包含以下元素:3,1,2,9,7
// 2.对列表进行升序排序
// 3.对列表进行降序排序
val list = List(3,1,2,9,7,15)
// 默认升序排列
val upSort = list.sorted
println(upSort)
// 降序:将升序后的列表倒序就是降序
val downSort = list.sorted.reverse
println(downSort)
}
2. 指定字段排序
案例代码:
def main(args: Array[String]): Unit = {
//根据列表List("01 hadoop","02 flume","03 kafka","04 redis")
val list = List("01 hadoop","02 flume","03 kafka","04 redis")
val test = list.sortBy((x:String)=>{
// 将字符串切割成不同的字段
val dd = x.split(' ')
// 按照第二个字段排序
dd(1)
})
println(test)
}
3. 自定义排序规则
案例代码:
def main(args: Array[String]): Unit = {
// 对List(12,3,4,1,6,8,7)进行降序排序
val list = List(12,3,4,1,6,8,7)
val test = list.sortWith((x,y) => {
// 降序
x > y
// 升序
// x < y
})
println(test)
}
分组
案例代码:
def main(args: Array[String]): Unit = {
val list = List("胡歌"->"男", "杨幂" -> "女","吴彦祖" -> "男","胡歌" -> "男")
// 按性别分组
val test = list.groupBy(x => x._2)
// 结果为Map('男'->list("胡歌"->"男","吴彦祖" -> "男","胡歌" -> "男"),‘女’->list( "杨幂" -> "女",))
println(test)
// 统计人数
val mapDd = test.map(x => (x._1,x._2.size))
println(mapDd)
}
聚合操作
1. reduce
案例代码:
def main(args: Array[String]): Unit = {
// 定义一个列表,包含:1,2,3,4,8,5,6,7,9,10
// 计算列表的和
val list = List(1,2,3,4,8,5,6,7,9,10)
val sum = list.reduce(_ + _)
// list.reduce((a,b) => { a + b })
println(sum)
}
案例:
- 定义列表:记录学生的成绩,格式为:姓名,语文成绩,数学成绩,英语成绩,学生信息如下:(“张三”,37,90,100),(“李四”,90,71,81),(“赵六”,59,21,72),(“田七”,100,100,100),(“赵甲第”,98,99,83)
- 获取所有语文成绩在60分及以上的同学信息
- 获取所有学生的总成绩
- 按照总成绩降序排列
- 打印结果
def main(args: Array[String]): Unit = {
//1. 定义列表:记录学生的成绩,格式为:姓名,语文成绩,数学成绩,英语成绩,学生信息如下:("张三",37,90,100),("李四",90,71,81),("赵六",59,21,72),("田七",100,100,100),("赵甲第",98,99,83)
val info = List(("张三",37,90,100),("李四",90,71,81),("赵六",59,21,72),("田七",100,100,100),("赵甲第",98,99,83))
//2. 获取所有语文成绩在60分及以上的同学信息
val chinese = info.filter(x => {
x._2 >= 60
})
println("语文及格:"+chinese)
//3. 获取所有学生的总成绩
val sum = info.map(x => {
val all = x._2 + x._3 + x._4
(x._1 , x._2 , x._3 , x._4 , all)
})
println("成绩总和:"+sum)
//4. 按照总成绩降序排列
val sort1 = sum.sortWith((_._5 > _._5))
println("降序排序:"+sort1)
}