Scala之函数式编程(2)

1.排序

  • sorted默认排序 从小到大
scala> List(55,88,99,66,44).sorted
res2: List[Int] = List(44, 55, 66, 88, 99)
  • sortBy指定字段排序
    根据传入的函数转换后,再进行排序
方法:
def sortBy[B](f: (A) ⇒ B): List[A]

例子:
1.有一个列表,分别包含以下文本行:"01 hadoop", "02 flume", "03 hive", "04 spark"
2.请按照单词字母进行排序
scala> val a = List("01 hadoop", "02 flume", "03 hive", "04 spark")
a: List[String] = List(01 hadoop, 02 flume, 03 hive, 04 spark)

// 获取单词字段
scala> a.sortBy(_.split(" ")(1))      
res8: List[String] = List(02 flume, 01 hadoop, 03 hive, 04 spark)
  • sortWith自定义排序
    自定义排序,根据一个函数来进行自定义排序
def sortWith(lt: (A, A)Boolean): List[A]

案例:
1.有一个列表,包含以下元素:2,3,1,6,4,5
2.使用sortWith对列表进行降序排序

方法1: 

scala> val a = List(2,3,1,6,4,5)
a: List[Int] = List(2, 3, 1, 6, 4, 5)
​
scala> a.sortWith((x,y) => if(x<y)true else false)
res15: List[Int] = List(1, 2, 3, 4, 5, 6)
​
scala> res15.reverse
res18: List[Int] = List(6, 5, 4, 3, 2, 1)

//优化:一步一步简化案例,直至用下划线表示。
scala> val a = List(2,3,1,6,4,5)
a: List[Int] = List(2, 3, 1, 6, 4, 5)
val hs1=(x:Int,y:Int)=> if(x>y) true else false
a.sortWith(hs1)
a.sortWith((x:Int,y:Int)=> if(x>y) true else false)
a.sortWith((x,y)=> if(x>y) true else false)



// 函数参数只在函数中出现一次,可以使用下划线代替(函数式编程思想)
scala> a.sortWith(_ > _) 
res19: List[Int] = List(6, 5, 4, 3, 2, 1)

//在优化:一行搞定
List(2,3,1,6,4,5).sortWith(_ > _)

在这里插入图片描述

2.分组

**简介:**我们如果要将数据按照分组来进行统计分析,就需要使用到分组方法

定义
groupBy表示按照函数将列表分成不同的组

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

过程:
在这里插入图片描述
案例:

1.有一个列表,包含了学生的姓名和性别: 

"张三", "男"
"李四", "女"
"王五", "男"

2.请按照性别进行分组,统计不同性别的学生人数

scala> val a = List("张三"->"男", "李四"->"女", "王五"->"男")
a: List[(String, String)] = List((张三,), (李四,), (王五,))// 按照性别分组
scala> a.groupBy(_._2)    // _通配符  _N 访问第N个元素
res0: scala.collection.immutable.Map[String,List[(String, String)]] = Map(-> List((张三,), (王五,)),-> List((李四,)))// 将分组后的映射转换为性别/人数元组列表
scala> res0.map(x => x._1 -> x._2.size)   //第一个元素  在分组的基础上第二个元素的长度
res3: scala.collection.immutable.Map[String,Int] = Map(-> 2,-> 1)

在这里插入图片描述

3.聚合操作

reduce表示将列表,传入一个函数进行聚合计算

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

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

在这里插入图片描述

例子:
1.定义一个列表,包含以下元素:1,2,3,4,56,7,8,9,5,5,8
2.使用reduce计算所有元素的和

scala> val a = List(1,2,3,4,56,7,8,9,5,5,8)
a: List[Int] = List(1, 2, 3, 4, 56, 7, 8, 9, 5, 5, 8)
​
scala> a.reduce((x,y) => x + y)
res12: Int = 108// 第一个下划线表示第一个参数,就是历史的聚合数据结果
// 第二个下划线表示第二个参数,就是当前要聚合的数据元素
scala> a.reduce(_ + _)  //两个下划线代表两个参数
res12: Int = 108// 与reduce一样,从左往右计算
scala> a.reduceLeft(_ + _)
res12: Int = 108// 从右往左聚合计算
scala> a.reduceRight(_ + _)
res12: Int = 108

4. 折叠 fold

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

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

案例
1.定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
2.使用fold方法计算所有元素的和
参考代码
scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)
​
scala> a.fold(100)(_ + _)
res4: Int = 106
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
函数式编程(FP)是一种软件开发风格,它注重不依赖于编程状态的函数。函数式代码易于测试和复用,容易实现并发,且不容易受到bug的攻击。Scala是一种能很好支持函数式编程的新兴JVM语言。《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 我是使用scala做完一个项目之后,开始阅读本书。 介绍下背景: 1 程序员 2 前C程序员,linux平台,没有很深的java背景 3 用scala做过一个2年期的项目 在使用scala的过程中,碰到的问题主要体现在: 1 scala的很多语法糖不理解,不知道为啥要这么写,有种为了这么写的简洁而这么写的感觉 2 scala很多库在设计的时候,不理解原因,包括Option,Collection的很多看似有冗余的地方 3 很多scala的默认写法,不理解 4 多态的具体化,尤其是协变的意义所在 5 各种重载的符号使用 之前读过 programming in scala,对语言的整体还停留在: 1 scala用起来比java更灵活 2 强大的collection,可以更加方便的处理collection类的数据 3 不同于java的并行处理方法,有点像c的逻辑思路 4 开发成本比java小,但是语言学习成本比java高很多 正在阅读这本书的过程中,只能一点一点说。 第一部分快要读完了,习题也快要做完了。 1 第一部分主要着墨点正是回答我上述问题的1,2,3的。很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时也解释了为什么在scala中,val和var的区分为什么那么重要。 3 在做习题的过程中,尤其是在做类型推导的过程中,对原来oop,命令式编程向函数式编程转变有很大作用;而且简洁的语法,确实让人有享受编程的感觉。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值