1. Scala的集合体系结构

Scala中的集合体系主要包括(结构跟Java相似):

  • Iterable(所有集合trait的根trait)
  • Seq(Range、ArrayBuffer、List等)
  • Set(HashSet、LinkedHashSet、SortedSet等)
  • Map (HashMap、SortedMap、LinkedHashMap等)

Scala中的集合分为可变和不可变两类集合,分别对应scala.collection.mutable和scala.collection.immutable两个包。

2. List

List代表一个不可变的列表。

  • List有head和tail,head代表List的第一个元素,tail代表第一个元素之后的所有元素。

scala> val list = List(1, 2, 3, 4)
list: List[Int] = List(1, 2, 3, 4)
scala> list.head
res33: Int = 1
scala> list.tail
res34: List[Int] = List(2, 3, 4)

  
案例:用递归函数给List中每个元素都加上指定的前缀并打印


// 如果List只有一个元素,那么他的tail就是Nil
def decorator(list: List[Int], prefix: String){
if (list != Nil) {
println(prefix + list.head)
decorator(list.tail, prefix)
}
}
scala> decorator(list, "+")
+1
+2
+3
+4

  • List有特殊的::操作符,可以用于将head和tail合并成一个List。

scala> list
res37: List[Int] = List(1, 2, 3, 4)
scala> 0::list
res38: List[Int] = List(0, 1, 2, 3, 4)

该操作符在Spark源码中有体现

3. LinkedList

LinkedList代表一个可变的列表,其elem和next属性类似于List的head和tail。

案例:使用while循环将LinkedList中每个一个元素乘以二。


val list = scala.collection.mutable.LinkedList(1,2,3,4,5,6,7,8,9)
var currentList = list
var first = true
while( currentList !=Nil && currentList.next != Nil){
if(first) { currentList.elem *= 2; first = false}
currentList = currentList.next.next
if(currentList != Nil) currentList.elem *= 2
}
list: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 2, 6, 4, 10, 6, 14, 8, 18)

4. Set

Set代表一个没有重复元素的集合

HashSet

不保证插入顺序,元素是乱序的


scala> val s = new scala.collection.mutable.HashSet[Int]()
s: scala.collection.mutable.HashSet[Int] = Set()
scala> s += 1
res40: s.type = Set(1)
scala> s += 2
res41: s.type = Set(1, 2)
scala> s += 5
res42: s.type = Set(1, 5, 2)

LinkedHashSet

保证插入顺序,底层使用链表


scala> val s = new scala.collection.mutable.LinkedHashSet[Int]()
s: scala.collection.mutable.LinkedHashSet[Int] = Set()
scala> s += 1
res43: s.type = Set(1)
scala> s += 2
res44: s.type = Set(1, 2)
scala> s += 5
res45: s.type = Set(1, 2, 5)

SortedSet

会自动根据key来进行排序(默认字母顺序)


scala> val s = scala.collection.mutable.SortedSet("orange", "apple", "banana")
s: scala.collection.mutable.SortedSet[String] = TreeSet(apple, banana, orange)

5. 集合的函数式编程(重要!)

Scala中集合的函数式编程最大的体现就是对于一系列高阶函数的使用。

高阶函数的使用是Scala与Java最大的区别!因为Java中没有函数式编程,也肯定没有高阶函数,无法直接将函数传入一个方法,或者让一个方法返回一个函数。


// 为List中的每个元素都添加一个前缀
scala> List("leo", "spark","peter").map("name is " + _)
res47: List[String] = List(name is leo, name is spark, name is peter)
// 拆分单词
scala> List("Hello world", "your are my friend").flatMap(_.split(" "))
res48: List[String] = List(Hello, world, your, are, my, friend)
// 打印每一个元素
scala> List("Hello world", "your are my friend").foreach(println(_))
Hello world
your are my friend
// 学生姓名和成绩进行关联
scala> List("leo", "jen", "jack").zip(List(100, 30, 20))
res50: List[(String, Int)] = List((leo,100), (jen,30), (jack,20))

6. 综合案例:统计多个文本内的单词总数


// 使用scala的IO包将文件文件内的数据读取出来
scala> val lines1 = scala.io.Source.fromFile("E://test.txt").mkString
lines1: String = hello my
scala> val lines2 = scala.io.Source.fromFile("E://test2.txt").mkString
lines2: String = you are a good boy
// 使用List的伴生对象,将多个文件内的内容创建为一个List
scala> val lines = List(lines1, lines2)
lines: List[String] = List(hello my, you are a good boy)
// 首先将所有元素以空格分割单词,接着将每个单词映射为(单词,1)元组, 然后再取出元组里的第二个元素(_._2表示取出元组中的第二个元素),最后做累加
scala> lines.flatMap(_.split(" ")).map((_, 1)).map(_._2).reduceLeft(_ + _)
res51: Int = 7

注意:最后一行多个高阶函数的链式调用其实就是Scala函数式编程的精髓所在,也是Scala相较于Java等编程语言最大的功能优势所在。并且Spark的源码中大量使用了这种复杂的链式调用,Spark本身提供的开发API也完全沿用了Scala的函数式编程。

Scala入门系列(十):函数式编程之集合操作的更多相关文章

  1. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  2. Scala编程入门---函数式编程之集合操作

    集合的函数式编程: 实战常用: //map案例实战:为List中的每个元素都添加一个前缀. List("leo","Jen","peter" ...

  3. scala 函数式编程之集合操作

    Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...

  4. Scala - 快速学习09 - 函数式编程:一些操作

    1- 集合类(collection) 系统地区分了可变的和不可变的集合. scala.collection包中所有的集合类 可变集合(Mutable) 顾名思义,意味着可以修改,移除或者添加一个元素. ...

  5. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...

  6. Scala入门系列(九):函数式编程

    引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...

  7. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  8. Scala入门系列(三):数组

    Array 与Java的Array类似,也是长度不可变的数组,此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组. 注意:访问数组中元素使 ...

  9. Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

    一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = la ...

随机推荐

  1. hive1.2.2部署

    1.解压hvie.tar,进入conf目录下,cp hive-default.xml.template hive-site.xml; 2.将hive下的新版本jline的JAR包拷贝到hadoop下: ...

  2. maximum shortest distance

    maximum shortest distance Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  3. 工控SCADA模型 基于HTML5 Canvas WebGL制作摩托车

    工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,以下 ...

  4. ldap数据库--ODSEE--suffix

    ldap数据库的suffix是建立ldap之间复制协议的基础,suffix的创建也可以通过管理界面进行,也可以通过命令行进行.不同点是通过管理界面创建的suffix会自动创建一条对应该suffix的匿 ...

  5. HTTPCLIENT 模拟登陆

    第一步构建忽略https验证的httpclient public static CloseableHttpClient getHttpClient() throws Exception { SSLCo ...

  6. java中自动装箱带来的性能问题

    之前没有特别注意自动封装所带来的性能问题,今天看了effective java,实验了一下,结果大吃一惊: 考虑下面这段代码: public static void main(String args[ ...

  7. 根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局

    在数学中,矩阵是以行和列排列的数字,符号或表达式的矩形阵列,任何矩阵都可以通过相关字段的标量乘以元素.矩阵的主要应用是表示线性变换,即f(x)= 4 x等线性函数的推广.例如,旋转的载体在三维空间是一 ...

  8. Lucene搜索引擎例子demo

    一.导入相应的jar包 KAnalyzer3.2.0Stable.jar lucene-analyzers-3.0.1.jar lucene-core-3.0.1.jar lucene-highlig ...

  9. Wordpress上传文件 “无法建立目录wp-content/uploads/2018/25。有没有上级目录的写权限?”

    可能的原因有两个: wp-content/uploads 文件夹权限所限制 解决方法:修改wp-content/uploads 文件夹权限,可以借助ftp等工具: wp_options表中upload ...

  10. Snow and Rainbow

    缘分,让我们走到了一起.让这个美好的时刻美好的回忆记录在这里吧.