最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Scala函数式编程之集合操作总结

XAMPP新闻 admin 54浏览 0评论
 Scala大数据领域独领风骚之集合操作。
drd21

一、Scala集合简介

scala同时支持不可变集合和可变集合。不可变集合(不能动态变化)位于scala.collection.immutable包下;可变集合位于 scala.collection.mutable包下。scala默认采用不可变集合,对于几乎所有的集合类,scala都同时提供了可变和不可变的版本。

scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。

Scala 的集合设计是最容易让人着迷的地方。通过 Scala 提供的集合操作,基本上可以实现 SQL 的全部功能,这也是为什么 Scala 能够在大数据领域独领风骚的重要原因之一。

 

二、Scala函数式编程

集合的函数式编程在大数据处理方面非常重要,必须完全掌握和理解Scala的高阶函数,Scala的集合类的map、flatMap、reduce、reduceLeft、foreach等这些函数都是高阶函数,因为可以接收其他函数作为参数。高阶函数的使用,也是Scala与Java最大的一点不同。java 8引入了函数式编程Lambda表达式。

三、常用集合操作一行代码搞定

1. 过滤出集合中所有偶数

filter方法会将序列中各个元素依次替换到下划线”_”所处位置,如果返回true,则保留该元素。

(1 to 9).filter( _ % 2 == 0 )

输出:2, 4, 6, 8

2. 对序列中所有元素求和

reduceLeft是一个通用的聚集计算方法,你可以把”+”换成其它的运算符。

(1 to 9).reduceLeft(_ + _)

输出:45

3. 统计单词出现次数

groupBy方法可以将序列转换成Map,适合用在需要按某个属性进行统计的情况。

List("one", "two", "one", "four").groupBy(w => w).mapValues(_.length)

输出:

scala.collection.immutable.Map[String,Int] = Map(one -> 2, four -> 1, two -> 1)

 

4. 将序列中单词首字母大写

map可以把序列转换成另一个序列,在map方法中定义各个元素的转换过程。

List("one", "line", "of", "code").map(_.capitalize)

输出:List(One, Line, Of, Code)

 

5. 将序列拼接成字符串

mkString方法用于将序列拼接成字符串,第1个参数是起始符号,第2个参数是分隔符,第3个参数是结束符号。

(1 to 9).mkString("(", ",", ")")

输出:(1,2,3,4,5,6,7,8,9)

 

6. 最大值,最小值和求和

这在Scala中轻而易举,直接调用min,max和sum方法。

List(14, 35, -7, 46, 98).min
输出:-7 
List(14, 35, -7, 46, 98).max
输出:98 
List(14, 35, -7, 46, 98).sum
输出:186

7. 获取序列中最大的前3个数值和位置

zipWithIndex方法将序列List[Int]转换成List[(Int, Int)],即List[Tuple2[Int, Int]]。Tuple2的第1个Int是元素,第2个Int是元素所处的位置。

List(2, 0, 1, 4, 12, 5).zipWithIndex.sorted.reverse.take(3)

输出:List((12,4), (5,5), (4,3))

8. 读取文本文件

在Scala中读取文本文件相当轻松。

val fileContent = io.Source.fromFile("myfile.txt").mkString
val fileLines = io.Source.fromFile("myfile.txt").getLines.toList

9. 下载URL链接

下载文件就是这么容易。其实利用sys.process包,我们可以用Scala编写Shell脚本,是不是很酷!

import sys.process._
import java.net.URL
import java.io.File
new URL("http://www.oschina.net/favicon.ico") #> new File("d:/favicon.ico") !!

10. 并行计算

par方法将原序列转换成并行序列,可以利用多核的优势加快处理速度,实现并行计算。Scala 的并行集合可以利用多核优势加速计算过程,通过集合上的 par 方法,我们可以将原集合转换成并行集合。并行集合利用分治算法将计算任务分解成很多子任务,然后交给不同的线程执行,最后将计算结果进行汇总。

(1 to 1000000).par.sum

输出:Int = 1784293664

 

11. 两个List相乘求和

类似加权求和。

dataList.zip(weightList).map{t => t._1 * t._2}.sum

 

12. 按多个字段排序List

先按学生的年龄排序,如果年龄相同,则按分数排序:

    case class Student(name: String, age: Int, score: Int)
    List(
      Student("a", 14, 60), 
      Student("b", 15, 80), 
      Student("a", 15, 70)
    ).sortBy(s => (s.age, s.score))

输出:List(Student(a,14,60), Student(a,15,70), Student(b,15,80))

 

13. 将List相邻元素分组

每相邻的10个元素分成一组:

val list = (0 to 20).map(_.toString)
输出:
Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

list.zipWithIndex.map(t => t._1 -> ((t._2 / 10) * 10)).groupBy(_._2).toList.sortBy(_._1).map(_._2.map(_._1))
输出:
List(Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), Vector(10, 11, 12, 13, 14, 15, 16, 17, 18, 19), Vector(20))

14. 取序列的第1个元素

List(3, 6, 5).headOption.getOrElse(0)

输出:Int = 3

对Scala高阶函数的理解、掌握和使用,可以大大增强学习spark等大数据计算框架的效率,在Spark源码中,有大量的函数式编程,以及基于集合的高阶函数的使用,所以必须掌握,才能看懂spark源码。

Scala 的集合设计是是否让你着迷了_Scala高阶函数更多使用待续。。。

drd021

转载请注明:XAMPP中文组官网 » Scala函数式编程之集合操作总结