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. 前端性能优化jQuery性能优化

    一.使用合适的选择器 $("#id"); 1.使用id来定位DOM元素无疑是最佳提高性能的方式,因为jQuery底层将直接调用本地方法document.getElementById ...

  2. 版本控制之二:SVN的初步使用(转)

    转自http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Tortoise ...

  3. Django开发小型站之前期准备(一)

    语言:python3.5 工具:JetBrains PyCharm virtualenvwrapper优点: 1.使不同的应用开发环境独立 2.环境升级不影响其他应用,也不会影响全局的python环境 ...

  4. HDU1005 Number Sequence (奇技淫巧模拟)

    A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...

  5. DOM 遍历-同胞

    在 DOM 树中水平遍历 有许多有用的方法让我们在 DOM 树进行水平遍历: siblings() next() nextAll() nextUntil() prev() prevAll() prev ...

  6. java 猜系统获取的随机数

    int randomNumber=(int)(Math.random()*8)+1; 注释是:得到一个1到8之间的随机整数. /************************************ ...

  7. Java 中实现方法重试的一种机制

    有这样一个需求,当调用某个方法抛出异常,比如通过 HttpClient 调用远程接口时由于网络原因报 TimeOut 异常:或者所请求的接口返回类似于"处理中"这样的信息,需要重复 ...

  8. SimpleMarkdown - 一款简单的Markdown编辑器

    源码地址: https://github.com/zhuangZhou/SimpleMarkdown 预览地址: http://hawkzz.com:8000 作者网站:http://hawkzz.c ...

  9. python学习笔记 map&&reduce

    ---恢复内容开始--- 1.map 1)map其实相当对吧运算符进行一个抽象,返回的是一个对象,但是这里不知道为什么不可以对一个map返回变量打印两次,难道是因为回收了? def f(x): ret ...

  10. 圆形的ImageView

    转载自gitHub的ImageView,因为本身就是可用的,也没什么好说的,拷贝回去用就是了,可以设置除了背景,还可以设置边框什么的,比起CardView设置圆角,功能更加强大. import and ...