您的位置:首页 > 其它

scala 集合

2016-03-16 13:36 423 查看



基本数据结构

Scala提供了一些很方便的集合类。

参考 《Effective Scala》中关于怎么使用集合类的内容。


List



Set

集合中没有重复元素



元组(Tuple)

元组可以直接把一些具有简单逻辑关系的一组数据组合在一起,并且不需要额外的类。

和case class不同,元组的元素不能通过名称进行访问,不过它们可以通过基于它们位置的名称进行访问,这个位置是从1开始而非从0开始。

元组可以很好地和模式匹配配合使用。

创建一个包含2个值的元组有一个很简单的方式:
->


参考 《Effective Scala》中关于解除绑定(拆封一个元组)的观点。



Map

Map里可以存放基本的数据类型。

这个看起来是一个特殊的语法,不过回想一下前面我们讨论元组的时候,
->
符号是可以用来创建元组的。

Map()可以使用我们在第一节里讲到的可变参数的语法:
Map( 1 -> "one", 2 -> "two")
,它会被扩展为
Map((1,"one"),(2,"two"))
,其中第一个元素参数是key,第二个元素是value。

Map里也可以包含Map,甚至也可以把函数当作值存在Map里。



Option

Option
是一个包含或者不包含某些事物的容器。

Option的基本接口类似于:

Option本身是泛型的,它有两个子类:
Some[T]
None


我们来看一个Option的示例:
Map.get
使用
Option
来作为它的返回类型。Option的作用是告诉你这个方法可能不会返回你请求的值。

现在,我们要的数据存在于这个
Option
里。那么我们该怎么处理它呢?

一个比较直观的方法就是根据
isDefined
方法的返回结果作出不同的处理。

不过,我们更加建议你使用
getOrElse
或者模式匹配来处理这个结构。

getOrElse让你可以很方便地定义一个默认值。

模式匹配可以很好地和
Option
进行配合使用。

val result = res1 match { case Some(n) => n * 2 case None => 0 }


参考 《Effective Scala》中关于 Options的内容。


函数组合器

List(1,2,3) map squared
会在列表的每个元素上分别应用
squared
函数,并且返回一个新的列表,可能是
List(1,4,9)
。我们把类似于
map
这样的操作称为组合器。(如果你需要一个更好的定义,你或许会喜欢Stackoverflow上的关于组合器的解释


map

在列表中的每个元素上计算一个函数,并且返回一个包含相同数目元素的列表。

或者传入一个部分计算的函数


foreach

foreach和map相似,只不过它没有返回值,foreach只要是为了对参数进行作用。

没有返回值。

你可以尝试把返回值放在一个变量里,不过它的类型应该是Unit(或者是void)


filter

移除任何使得传入的函数返回false的元素。返回Boolean类型的函数一般都称为断言函数。


zip

zip把两个列表的元素合成一个由元素对组成的列表里。


partition

partition
根据断言函数的返回值对列表进行拆分。


find

find返回集合里第一个匹配断言函数的元素


drop & dropWhile

drop
丢弃前i个元素

dropWhile
移除前几个匹配断言函数的元素。例如,如果我们从numbers列表里
dropWhile
奇数的话,
1
会被移除(
3
则不会,因为它被
2
所“保护”)。


foldLeft

0是起始值(注意numbers是一个List[Int]),m是累加值。

更加直观的来看:


foldRight

这个和foldLeft相似,只不过是方向相反。


flatten

flatten可以把嵌套的结构展开。



flaoMap

flatMap是一个常用的combinator,它结合了map和flatten的功能。flatMap接收一个可以处理嵌套列表的函数,然后把返回结果连接起来。

可以把它当作map和flatten两者的缩写:

这个调用map和flatten的示例是这些函数的类“组合器”特点的展示。

See Also Effective Scala has opinions about flatMap.

参考 《Effective Scala》中关于flatMap的内容.



广义的函数组合器

现在,我们学习了一大堆处理集合的函数。

不过,我们更加感兴趣的是怎么写我们自己的函数组合器。

有趣的是,上面展示的每个函数组合器都是可以通过fold来实现的。我们来看一些示例。

为什么要List[Int]?因为Scala还不能聪明到知道你需要在一个空的Int列表上来进行累加。



如何处理好Map?

我们上面所展示的所有函数组合器都能都Map进行处理。Map可以当作是由键值对组成的列表,这样你写的函数就可以对Map里的key和value进行处理。

现在过滤出所有分机号码小于200的元素。

因为你拿到的是一个元组,所以你不得不通过它们的位置来取得对应的key和value,太恶心了!

幸运的是,我们实际上可以用一个模式匹配来优雅地获取key和value。

为什么这样也可以呢?为什么可以直接传入一个局部的模式匹配呢?

这个内容就留在下周吧!

英文原文: Scala School,翻译:ImportNew 朱伟杰

本文链接:http://www.importnew.com/3673.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: