在Scala中映射之键值对的集合,元组是n个对象的聚集,但是对象的类型不一定相同

本节内容要点

  1.   Scala中映射的创建,遍历和查询
  2.   如何从可变和不可变映射中做出选择
  3.   Scala映射和Java映射见的互操作
  4.   Scala中元组的使用

一.构造映射

   我们可以这样来构造一个映射:

val scores = Map("ysl"->100,"wdd"->90)

   上述代码构造一个不可变的Map[String,Int],其值不可以被改变。如果需要创建一个可变的映射,可以用:

val scores = scala.collection.mutable.HashMap[String,Int]()

在Scala中,映射是对偶的集合。对偶简单的说就是两个值构成的组,这两个值的类型不要求相同,比如("ysl",100)

->操作符用于创建对偶

"ysl" -> 100

上述代码的职位("ysl",100)

因此,完全可以用下面的方式来创建映射

val scores = Map(("ysl",100),("wdd",90))

二.获取映射的值

  在Scala中映射和函数之间的相似性十分的明显,因为你可以使用()表示法来查询某个键值对的值

val yslScore = scores("ysl")

如果映射中不包含查询的值,将会抛出异常。

要检查映射中是否包含某个键值可以使用contains方法:

val yslScore = if(scores.contains("ysl")) scores("ysl") else 0

有这种用法十分的普遍,Scala提供了一个简便的方法来简化上述操作 

val yslScore = scores.getOrElse("ysl",0)

注意:映射.get(键)这样的调用的返回值是一个Option对象,要么是Some(键值对的值),要么是None,我们将在后面详细介绍Opion类

三.修改映射中的值

  在可变的映射中,你可以修改映射中的值,或则向映射中添加新的映射关系,做法是在=的左测使用(),例如:

scores("ysl") = 89//更新ysl做对应的值,scores必须是可变的,否则会报错
scores("tom") = 89//增加新的键值对

当然,也可以使用+=操作来添加多个关系

scores += ("jim"->78,"kit"->56)

要移除某个键值对的值使用-=操作

 scores -= "ysl"

你不能更新一个不可变的映射,但是可以基于某个映射生成一个新的映射

val newScores = scores + ("jim"->89,"ketty"->100)

四。映射的便利

  你可以使用如下超级简单的方式便利映射

for((k,v) <- 映射) 处理k,v

  之所以能这样便利映射,主要是因为Scala的for循环中使用可模式匹配,这样以来不需要冗余的方法调用,你就可以得到每一个对偶的键值

  如果你只需要访问键或则值,像Java一样可以使用keySet和values方法。values方法返回一个Iterable,你可以使用for便利Iterable

for(v <- scores.values) print(v)

要转换一个映射,比如交换见和值的位置,可以使用

for((k,v) <- scores) yield (v,k)

 五.排序的映射

  在操作映射的时候,你需要选择一个实现-一个hash表或则一个平衡树。默认Scala使用的是hash表。如果需要顺序访问所有的键,你需要一个树型映射

要得到一个不可变的树型映射的话可以使用:

val scores = scala.collection.immutable.SortedMap("ysl"->10,"wdd"->8,"tom"->9)

但是Scala2.12.3中没有可变的树型映射,要实现可变的树型映射,需要使用Java的TreeMap

如果要按照插入的顺序访问插入的键,可以使用LinkedHashMap

六.映射Scala与Java互操作

如果你想要Java的映射转换为Scala的映射,以便方便的使用Scala的API。这对于需要操作Scala并没提供的可变的树型映射的情况是十分的有用的。

你只需要引入如下的语句便可实现:

import scala.collection.JavaConversions.mapAsScalaMap

然后制定Scala的映射类型来触发转换

val scores:scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String,Int]

除此之外,你还可以得到从.util.Proterties到Map[String,String]的转换

import scala.collection.JavaConversions.propertiesAsScalaMap
val props:scala.collection.Map[String,String] = System.getProperties()

反过来把Scala的映射转换为Java的映射,提供相反的隐士转换即可:

import scala.collection.JavaConversions.mapAsJavaMap
import java.awt.font.TextAttribute._
val attrs = Map(FAMILY -> "Serif",SIZE -> 12)
val font = new java.awt.Font(attrs)

七.元组

  映射是键值对欧的集合,对偶是元组最简单的形态----元组是不同类型值的聚集。

  元组是将单个值包含在()中构成的,例如

  (1,3.14,"tom")

  类型是:Tuple3(Int,Double,String),也可以写成(Int,Double,String)

  你可以使用方法_1,_2,_3来访问元组,比如:

val second = tt._2

和数组和字符串中的下边不同,元组的下边是从1开始的。

通常使用模式匹配来获取元组中组员,例如:

val (first,second,third) = tt

如果不是每一个组员都需要,可以在不需要的位置使用_,例如:

val (first,second,_) = tt

元组可以用于函数返回值不是一个值的情况。关于函数将在后面详细介绍

八.拉链操作

  使用元组的原因之一是把多个值绑定在一起,以便他们能够被统一处理,这通常可以用zip方法来完成。例如:

val symbols = Array("<","-",">")
val count = Array(2,10,2)
val pairs = symbols.zip(count)

输出结果为:pairs: Array[(String, Int)] = Array((<,2), (-,10), (>,2))

然后可以对输出结果作统一的处理:

for((s,n) <- pairs) Console.print( s * n)

输出结果:<<---------->>

toMap方法可以对偶集合转化为映射。如:

symbols.zip(count).toMap

Scala从入门到精通之四-映射和元组的更多相关文章

  1. Scala快速入门到精通 视频教程 百度云网盘下载地址

    Scala快速入门到精通  视频教程 百度云网盘下载地址 Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bqGIKyF 密码:ojwd

  2. 快学Scala习题解答—第四章 映射和元组

    4 映射和元组  4.1 设置一个映射,当中包括你想要的一些装备,以及它们的价格.然后构建还有一个映射.採用同一组键,可是价格上打9折 映射的简单操作  ,"gun"->18 ...

  3. oracle数据库从入门到精通之四

    序列是oracle中较为重要的概念事务对于ddl是不起作用的查询,更新,数据表,约束这些个概念要掌握.在许多数据库之中都会存在一种数据类型--自动增长列,它能够创建流水号12c之前并没有提供这样一个自 ...

  4. Scala2.12 从入门到精通实战高端视频课程(含网盘下载地址)

    Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bTSZSlWftFYaLQL6lVH62A 提取码:ohfk 下载后使用视频中自带的专用播放器打开视频就能看 ...

  5. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  6. 5、ASP.NET MVC入门到精通——NHibernate代码映射

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一篇NHibernate学习笔记—使用 NHibernate构建一个ASP.NET MVC应用程序 使用的是xml进行orm映射,那么这一 ...

  7. Hibernate从入门到精通(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...

  8. Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  9. Hibernate从入门到精通(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...

随机推荐

  1. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

  2. 二、js的控制语句

    二.流程控制语句 ECMA-262规定了一组流程控制语句.语句定义了ECMAScript中的主要语法,语句通常由一个或者多个关键字来完成给定的任务.诸如:判断.循环.退出等.   语句的定义   在E ...

  3. Linux学习——shell编程之环境变量配置文件

    小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...

  4. Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较

    参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...

  5. Python协程爬取妹子图(内有福利,你懂得~)

    项目说明: 1.项目介绍   本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...

  6. Python s12 Day2 笔记及作业

    1. 元组的元素不可修改,但元组的元素的元素可以被修改. 2. name="eric" print(name.center(20, "*") 3. list=[ ...

  7. javascript中的DOM介绍(一)

    一.基础知识点 1.DOM是文档对象模型,是针对HTML和XML文档的一个API(应用程序接口) 2.DOM描绘了一个层次化的节点数,允许开发人员进行添加,移除个修改等操作 3.IE浏览器中所有的DO ...

  8. ThinkPHP中使用PHPMailer邮件类

    第一步.添加PHPMailer类库将下载后的文件解压,将PHPMail目录移动至ThinkPHP目录中的Vendor内.(请确保class.phpmailer.php文件就在ThinkPHP\Vend ...

  9. VS2017 编译 chromium和webrtc

    Chromium的编译和WebRTC的编译方式相同,WebRTC官网也是使用的Chromium的编译文档. 步骤一.跳 - 墙,先跳 - 墙这是第一步哟,chromium大概有10几个G,webrtc ...

  10. SQL SERVER 根据地图经纬度计算距离函数

    前些天客户提出一个这样的要求:一个手机订餐网,查询当前所在位置的5公里范围的酒店,然后客户好去吃饭. 拿到这个请求后,不知道如何下手,静静地想了一下,在酒店的表中增加两个字段,用来存储酒店所在的经度和 ...