快学Scala第4章--映射和元组

2024-05-06 07:58
文章标签 scala 映射 元组 快学

本文主要是介绍快学Scala第4章--映射和元组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

快学Scala第4章–映射和元组

映射是键/值(key-value)对偶的集合。Scala有一个通用的叫法–元组—–n个对象的聚集,并且不一定要相同类型的。而对偶不过是n=2的元组

本章要点

  • Scala有十分容易的语法来创建、查询和遍历映射
  • 你需要从可变的和不可变的映射中做出选择
  • 默认情况下,你得到的是一个哈希映射,不过你也可以指明要树形映射
  • 你可以很容易的在Scala映射和Java映射之间来回切换
  • 元组可以用来聚集值

构造映射

Scala映射的构建方式:

val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
// 你也可以以圆括号来定义:
val scores = Map(("Alice", 10), ("Bob",3), ("Cindy", 8))// 如果想从空的映射开始,你需要选定一个映射实现并给出类型参数
val scores = new scala.collection.mutable.HashMap[String, Int]

在Scala中,映射是对偶的集合。对偶简单的说是两个值构成的组,这两个值并不一定是同一个类型,比如(“Alice”, 10),这和C++的pair相同,是key-value的关系;在构建Map时,如果有多个对偶的key相同,则会只保留最后一个对偶,其实执行的是更新操作。
映射这种数据结构是一种将键映射到值的函数,区别在于通常的函数计算值,映射只是用来做查询。


获取映射中的值

val bobsScore = scores("Bob") // 以key索引value

如果映射并不包含请求中使用的key,则会抛出异常。要检查映射中是否有某个指定的key,可以使用contains方法:

val bobsScore = if (scores.contains("Bob")) scores("Bob") else 0
// 更快捷的方式
val bobsScore = scores.getOrElse("Bob", 0)

更新映射中的值

可变(mutable)映射中,你可以更新某个映射的值,或者添加一个新的映射关系:

scores("Bob") = 10  // 更新key "Bob" 对应的value
scores("Fred") = 7  // 增加新的key-value对偶到scores// 使用 += 来添加多个关系
scores += ("Bob" -> 10, "Fred" -> 7)
// 使用 -= 来移除某个key-value对偶
scores -= "Alice"

对于一个不可变的映射,不能改变它本身,但是可以产生一个新的映射:

val newScore = scores + ("Bob" -> 10, "Fred" -> 7)

此时newScore映射包含了与scores相同的映射关系,此外,”Bob”被更新, “Fred”被添加进来。
这里写图片描述
想要去除不可变映射的某个关系,也是通过产生新的映射:

val newScores = scores - "Alice"

这样不断的创建新的映射其实对效率没有太大的影响,因为老的映射和新的映射共享大部分结构,其原因就是因为它们不可变的。


迭代映射

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

如果只需要访问key或value,则可以使用keySet和values方法。values方法返回一个Iterable,可以在for循环中使用这个Iterable :

scores.keySet  // 一个类似于Set("Alice", "Bob", "Cindy")这样的集合
for (value <- scores.values) println(value)

这里写图片描述

要反转一个映射即交换key和value的位置:

for ((k, v) <- 映射) yield (v, k)

但是交换后,v变成了新映射的key,但是key不允许重复,因此将重复的key的丢掉
这里写图片描述

已排序映射

Scala的映射提供了两种数据结构:一个是哈希表,另一个是平衡树。在C++中,(没记错的话) STL中的Map使用的是红黑树。 默认情况下,Scala给的是哈希表。当然哈希表构成的map中的key是没有排序的,而平衡树构成的map的kay是排序的。 要得到一个树形映射:

val scores = scala.collection.immutable.SortedMap("Bob" -> 3, "Alice" -> 10, "Fred" -> 7, "Cindy" -> 8)

这里写图片描述
**注:**Scala并没有提供可变的树形映射,如果你想要,最接近的选择是使用Java的TreeMap

提示:如果要按插入顺序访问所有key,使用LinkedHashMap:

val months = scala.collection.mutable.LinkedHashMap("Jaunary" -> 1, "Februray" -> 2, "March" -> 3, "April" -> 4, "May" -> 5, ...)

与Java的互操作

有Java到Scala转换:

import scala.collection.JavaConversions.mapAsScalaMap
val scores: scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]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)  // Scala映射
val font = new java.awt.Font(attrs) // 该方法预期一个Java映射

元组

映射是Key-Value对偶的集合。对偶是元组(Tuple)的最简单形态——–元组是不同类型的数据的聚集。例如:

val t = (1, 3.14, "Fred")  // t是一个元组,类型为Tuple3[Int, Double, java.lang.String]// 访问元组的组元
t._1  // 1
t._2  // 3.14
t._3  // Fred

元组的各组元是从1开始的,这个和数组不同。
通常使用模式匹配的方式来获取元组的组元,例如

val (first, second, third) = t  // first为1, second为3.14, third为"Fred"
// 如果不需要某个组元,可以使用_代替
val (first, second, _) = t

元组可以用于函数需要返回的值不止一个的情况


拉链操作

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

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

这里写图片描述

symbols 的元素个数 小于 counts的元素个数时
这里写图片描述

symbols的元素个数 大于 counts的元素个数时
这里写图片描述

经过比较,zip操作时,得到的结果数量与数量少的集合相同。

可以使用tpMap方法将对偶的集合转换成映射,如: keys.zip(values).toMap

这篇关于快学Scala第4章--映射和元组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963826

相关文章

docker 重启容器且修改服务映射端口

要重启 Docker 容器并修改服务的映射端口,可以按照以下步骤进行操作: 1. 停止当前运行的容器 如果你想重新配置端口,通常需要先停止当前运行的容器。你可以使用以下命令停止容器: docker stop <container_name_or_id> 2. 删除现有容器 为了修改端口映射,你需要删除旧的容器并重新创建一个新的容器。首先运行以下命令删除停止的容器: docker rm

【scala 安装错误】错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner

错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 原因: Scala安装路径中包含空格。 解决办法:scala 不要安装在E:\Program Files 这种有空格的目录下,简直坑

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里,而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用,用完后还应该正确关闭。如果没有正确关闭,它们就会在下次打开时自动进行修复。因为修复可能会花很长一段时间,所以先正确关闭它们再结束程序是很重要的。 DETS表有着和ETS表不同的共享属性。DETS表在打开时必须赋予一个全局名称。如果两个或更多

maven项目中程序运行编译的时候出现:编码GBK的不可映射字符

由于JDK是国际版的,我们在用javac.exe编译时,编译程序首先会获得我们操作系统默认采用的编码格式(也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格

ManyToMany双向外键关联(基于注解)的映射案例(简单版)

学生和老师就是多对多的关系,一个学生有多个学生,一个老师也有多个学生,这里的多对多映射采用中间表连接的映射策略,建立中间表的映射策略,建立中间表分别引入俩边的主键作为外键。通过中间表映射俩个表之间的关系。 下面就以学生类和老师类为例介绍多对多的映射关系的实例 Students类 package mtm_bfk;import java.io.Serializable;import java.

Mybatis查询到多条记录但是映射到list集合只有一条或者条数不对

如果你出现了这个问题。 *. 原因:mybatis是基于当前实体对象的id进行映射的 *.所以在查询字段中加上查询id即可。 搞定!!!!

【高等数学学习记录】映射

【高等数学&学习记录】映射 从事测绘工作多年,深刻感受到基础知识的重要及自身在这方面的短板。 为此,打算重温测绘工作所需基础知识。练好基本功,为测绘工作赋能。 1 知识点 1.1 映射 映射 设 X X X、 Y Y Y是非空集合,若存在法则 f f f,使 X X X中每个元素 x x x,在 Y Y Y中有唯一确定的元素 y y y与之对应,则称 f f f为从 X X X到

NAT技术-将多个内部网络设备映射到一个公共IP地址

问题: 今天上课的时候老师让我们在VMware填同一个子网ip 192.168.196.0,然后给我们的linux镜像都是同一个压缩包,结果我们的静态ip地址都是同一个。 192.168.196.0下面有256个ip地址,范围是192.168.196.0到192.168.196.255。我们几十个人的ip地址怎么会是同一个 linux镜像的ip地址被老师写死了, 1.难道内网的ip可以随便定

使用Mybatis Generator插件生成纯净代码,自定义扩展注释和注释,xml映射文件,不用修改源码!!!

先看效果: (基于Mybatis-generator-core-1.4.0) 生成模型(实体): 根据MySQL库中的tb_prod_info表字段及注释自动生成. package com.ezsyn.cloudstudy.product.dao.entity;import io.swagger.annotations.ApiModelProperty;import lombok.Gette

spring boot 的tomcat部署,自己的view层不做映射

需要复写继承该类SpringBootServletInitializer 的config方法,网上有些直接写主入口类的,部署是不对的。一定要复写config方法。