Scala基础入门-3
学习Scala——映射和元组
映射和和元组,也就是Maps和Tuples。Map这东西应该都挺明白的,就是键值对的集合。而元组,tuple,这东西并不是每个语言都有(Python中是有的,不过当时学的时候没有完全分清楚)。
在Scala中,元组是n个对象的一个聚集(Map是n=2个对象的聚集),里面的内容不需要都是相同类型的。
构造Map
在Scala中,Map是对偶(算是键值对的另一个说法吧)的集合。->操作符用来创建对偶,"Alice" -> 10产出 ("Alice", 10)。
然后说说Scala中两个集合包的区别。在scala.collention.mutable包中的集合都是内容可变的,也就是创建了集合之后,集合的内容是可以变化的;而scala.collection.immutable包中,集合的内容是不可变的。由于拥抱函数式的缘故,默认都是使用immutable包。
// 创建一个内容不可变的Map[String, Int]
val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
// 创建一个内容可变的Map[String, Int]
val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
// 创建一个空Map[String, Int]
val scores = new scala.collection.mutable.Map[String, Int]
// 替换掉->操作符
val scores = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))
获取Map中的值
val bobsScore = scores("Bob")
如果Map中没有包含这个键值对,会抛出一个异常。用 contains()方法来检查是否包含指定的键。
由于这个使用方法很多,所以有一个更加快捷的写法:
如果说像Java中,使用 map.get("Bob"),会如何?会返回一个Option对象,要么是Some,要么是None。关于Option,以后介绍…
更改Map
对于可变的Map,更改某个已有的值,或者是添加一个没有的对偶,都是如下:
scores("Fred") = 7
想要添加多个对偶,则使用+=操作:
scores += ("Bob" -> 10, "Fred" -> 7)
移除某个对偶使用-=:
scores -= "Alice"
对不可变的Map来说,操作基本都会是返回一个新的Map:
// 获取一个添加了新对偶的Map
val newScores = scores + ("Bob" -> 10, "Fred" -> 7)
// 获取一个移除了对偶的Map
val newScores = scores - "Alice"
不需要担心这种操作的效率会很低,新旧Map共享大部分的结构。
迭代Map
for ((k, v) <- map)
// 单独拿出键
for (k <- map.keySet)
// 单独拿出值
for (v <- map.values)
已排序映射
在这里我知道了映射的实现方式通常是哈希表或者是一个平衡树。默认用的都是哈希表。如果需要一个排序的映射,就需要使用树形映射了。使用scala.collection.immutable.SortedMap即可。
不过Scala中并没有可变的树形映射,需要的时候使用Java中的TreeMap。
如果要按照插入的顺序访问所有键值,可以使用scala.collection.mutable.LinkedHashMap。
与Java的互操作
与数组中类似,引入函数后就可以触发转换。
// 从Java Map到Scala Map,适用于可变树形映射
import scala.collection.JavaConversions.mapAsScalaMap
// 从Java Properties到Scala Map
import scala.collection.JavaConversions.propertiesAsScalaMap
// 从Scala Map到Java Map
import scala.collection.JavaConversions.mapAsJavaMap
元组(Tuple)
元组是不同类型的值的聚集。
val t = (1, 3.14, "Fred") // 类型为Tuple3[Int, Double, java.lang.String]
// 访问组元
t._1 t._2 等方法,注意是从1开始的
// 不过通常是使用模式匹配来获取组元的
val (first, second, third) = t
// 如果说不是所有的组元都需要,那么在不需要的地方放上_
val (first, second, _) = t
有了这个,可以方便地返回多个值,让我想起了Go。
zip操作
看代码:
val symbols = Array("<", "-", ">")
val counts = Array(2, 10, 2)
val pairs = symbols.zip(counts)
// 得到:Array(("<", 2), ("-", 10), (">", 2))
// 可以使用toMap方法将对偶的集合转换成Map
keys.zip(values).toMap // 可想而知,这个集合需要是有序排列的
fRom:http://nerd-is.in/2013-08/scala-learning-maps-and-tuples/
Scala基础入门-3的更多相关文章
- Scala 基础入门【翻译】
原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变量 val.可变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果 ...
- Scala基础入门-1
首先需要Scala开发环境的搭建,网上自己找教程. 声明常量与变量 val foo = 0 // 常量 var bar = 0 // 变量 在Scala中,更加鼓励使用val来进行声明,也就是推荐使用 ...
- Scala基础入门-4
Scala学习——类 简单类和无参方法 class Counter { private var value = 0 // 必须初始化字段 def increment() { value += 1 } ...
- Scala基础入门-2
简单类和无参方法 class Counter { private var value = 0 // 必须初始化字段 def increment() { value += 1 } // 方法默认公有 d ...
- Scala基础入门-代码碎片
import scala.util.control._ import java.util.Date object Test { def main(args: Array[String]) { // v ...
- scala基础入门
1.scala当中申明值和变量 scala当中的变量申明可以使用两种方式,第一种使用val来申明变量.第二种使用var来申明变量. 申明变量语法 val/var 变量名 [:变量类型] = 变量值 其 ...
- Scala快速入门 - 基础语法篇
本篇文章首发于头条号Scala快速入门 - 基础语法篇,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注我的 ...
- 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell
Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
随机推荐
- ASP.NET MVC学习之路由篇
约束路由 上面我们有一个{id}用来捕获参数的,但是你也发现了它可以捕捉任何字符串等等,但是我们有时需要限制它,比如让它只能输入数字,那么我们就可以使用正则表达式去约束它. 如下修改RouteConf ...
- HDU 2653 - Waiting ten thousand years for Love
首先,对于一个 '@' 飞上去,飞下来都要耗1点魔力,所以是两点= = 然后站在同一格 魔力可能不同,所以要增加一维. 还有当前搜到的不一定是最小. 别的也没啥. #include <iostr ...
- linux下C++对线程的封装
之前一直是使用C语言,前段时间转做C++.无论使用什么语言,多线程编程都是不可或缺的.最近项目中又用到了线程,现在将线程的封装做出总结: 1.线程类中应该包含线程ID.线程的状态以及线程基本操作等. ...
- 深入浅析mysql引擎
mysql引擎 mysql数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译mysql.在缺省情况下,mysql支持三个引擎:ISAM,MYISAM和HEAP.另 ...
- Windows 下 Apache HTTP Server 安装、配置以及与 Tomcat 的整合(附图)
如果您能点开这篇文章,说明您已对熟悉Apache HTTP Server(下文用Apache简称)配置的重要性已很清楚了,本文不在赘述,直接介入正题,请往下阅读: 为便于阅读,列出文章目录: 一.Ap ...
- python-整理--使用IDE
如何使用python的IDE 安装好python3.4之后,默认有一个叫IDLE,就是目录lib/idlelib之下,是一个简单实用的工具. 在VS2013上安装一个插件就可以使用VS当IDE了.插件 ...
- XML新手入门 创建构造良好的XML(2)
本文描述了构建良好的XML需要遵循的规则.作者详细介绍了构建XML需要考虑的元素,如何命名约定.正确的标记嵌套.属性规则.声明和实体,以及DTD和schema的验证,十分便于新手开始学习了解XML. ...
- 比较常见的const与指针的组合情况
1.对于普通的const与基本类型组合,都是表示的是这是一个常量, const int a; int const a; 表示的意思是一样的,a是一个常量,不可改变 2.对于const与指针组合在一起, ...
- To and Fro(字符串水题)
To and Fro 点我 Problem Description Mo and Larry have devised a way of encrypting messages. They first ...
- FormSheet式模态视图,点击模态视图外隐藏模态视图的方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...