scala 集合
2016-03-16 13:36
423 查看
基本数据结构
Scala提供了一些很方便的集合类。参考 《Effective Scala》中关于怎么使用集合类的内容。
List
Set
集合中没有重复元素
元组(Tuple)
元组可以直接把一些具有简单逻辑关系的一组数据组合在一起,并且不需要额外的类。->
Map
Map里可以存放基本的数据类型。->符号是可以用来创建元组的。
Map()可以使用我们在第一节里讲到的可变参数的语法:
Map( 1 -> "one", 2 -> "two"),它会被扩展为
Map((1,"one"),(2,"two")),其中第一个元素参数是key,第二个元素是value。
Map里也可以包含Map,甚至也可以把函数当作值存在Map里。
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
更加直观的来看:
foldRight
这个和foldLeft相似,只不过是方向相反。
flatten
flatten可以把嵌套的结构展开。
flaoMap
flatMap是一个常用的combinator,它结合了map和flatten的功能。flatMap接收一个可以处理嵌套列表的函数,然后把返回结果连接起来。See Also Effective Scala has opinions about flatMap.
参考 《Effective Scala》中关于flatMap的内容.
广义的函数组合器
现在,我们学习了一大堆处理集合的函数。不过,我们更加感兴趣的是怎么写我们自己的函数组合器。
有趣的是,上面展示的每个函数组合器都是可以通过fold来实现的。我们来看一些示例。
如何处理好Map?
我们上面所展示的所有函数组合器都能都Map进行处理。Map可以当作是由键值对组成的列表,这样你写的函数就可以对Map里的key和value进行处理。幸运的是,我们实际上可以用一个模式匹配来优雅地获取key和value。
这个内容就留在下周吧!
英文原文: Scala School,翻译:ImportNew – 朱伟杰
本文链接:http://www.importnew.com/3673.html
相关文章推荐
- SYN6107型 GPS北斗双模子钟
- 指针数组和数组指针
- spring通过jdbc连接数据库
- D12
- apache服务器URL访问管理
- 64位Linux编译C代码,crt1.o文件格式不对的问题
- MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建
- 源码中TODO、FIXME和XXX的意义
- android Rx 技术
- C、C++等语言常见符号作用总结
- 删除文件夹
- HTTP2.0协议
- SYN6105型 GPS子钟
- ubuntu设置终端透明
- CentOS7.1 KVM虚拟化之虚拟机根分区扩容(8)
- 即时通讯之输入流中读取基本数据
- 从Eclipse转移到IntelliJ IDEA一点心得
- java.lang.SecurityException: Permission Denial: opening provider的解决方法
- ARM__UART详解
- JMeter学习(三十四)测试报告优化