12.Maps
1 Maps
1.1 Map声明和访问
maps中的元素是key-value对儿,key与value之间使用冒号(:)分割。创建一个空value的map,使用[:]。默认情况下,map的类型是java.util.HashMap。如果这些keys是String类型的,那么你可以不使用单引号或双引号括起来。
但是,如果使用变量作为key,需要将key用()括起来。
重新赋值map中的指定value,使用map[key]=value。
访问该map中的value,使用map[key];还可以使用get(key) or get(key,default)。在get(key,default)中,如果key不存在,返回的是default,同时,该(key,default)会增加到该map中。
|
package map /** * 声明和访问map * @author zuoys * */ class DeclareAndAccess { static main(args) { //创建一个有值的map def map = ["Jim":"Knopf","Thomas":"Edison"]; //点(.)操作符被重载来访问该value map.AnotherKey = "Testing"; //创建没加引号的keys def anotherMap = [Jim:"Knopf",Thomas:"Edison"]; //.size():map中元素的数量 assert anotherMap.size()==2; //key可以使用变量,但必须使用括号括起来,否则默认是"x",因为key可以不使用引号。 def x = "a"; //以下返回false,因为x可以不使用引号,因此认为是"x" println ([a:1]==[x:1]); //以下返回true println ([a:1]==[(x):1]); //创建一个空的map def emptyMap = [:] println("===============set/get"); println (map.get("Jim")) //重新设置value map["Jim"]="左运松"; //获取map中指定value println (map["Jim"]); println (map.get("Jim")); println (map.get("zuoys", "遥远2"));//map中没有zuoys,返回 遥远2,并新增zuoys:遥远2 println (map.get("zuoys"))//再次获取zuoys,获取到的是 遥远2 println("===============keySet()"); Set sets = map.keySet(); if (!sets.isEmpty()) { Iterator iterator = sets.iterator(); while (iterator.hasNext()) { String i = iterator.next(); println(i); } } } } |
输出
keySet()方法返回所有的keys,不重复的元素且没有顺序的。
1.2 遍历及是否包含
操作元素,可以使用闭包,基于each(), any() and every()方法。
each()返回T,遍历每个元素;any()和every()返回符合闭包中条件的Boolean。
|
package map import java.beans.WeakIdentityMap.Entry; class EachAnyEveryMethod { static main(args) { def mymap = [1:"左1",2:"左2",3:"左23"]; println("=======each,遍历每个元素,并验证每个key是否大于1") mymap.each { entry -> println(entry.key > 1)}; println("=======each,遍历每个元素,并验证每个value是否包含 2") mymap.each { entry -> println(entry.value.contains("2"))}; println "=======any,任何一个:" //验证 map中任何一个value,哪怕有一个value包含【左】都返回true,否则返回false println mymap.any {entry -> entry.value.contains("左")}; println "=======every,每一个"; /** * 验证 map中每一个的key的大小都要小于3,才返回true,否则哪怕有一个不小于3都返回false * 如果小于4,则输出true */ println mymap.every{ entry -> entry.key < 3}; println("=============使用keySet()遍历map"); def result = ''; for (key in mymap.keySet()) { result += key; } println (result); println("=============使用each{}遍历map"); mymap.each { key, value -> print key + " "; println value; }; println("=============使用each{}遍历map"); mymap.each { entry -> print entry.key +" "; println entry.value; }; } } |
输出
each{},中的参数:
可以是entry(完整的一条元素【含key,value】,entry可以起任意名字,因为只是参数而已)。
也可以是key,value(可以起任意名字,因为只是参数而已)。
1.3 搜索map
能够使用下边的方法搜索map:
- findAll(closure) – 找到符合闭包条件的所有元素
- find(closure) – 找到符合闭包条件的第一条元素。
- collect(closure) – 返回符合闭包条件的所有元素,其类型是list。
- submap('key1', 'key2',) – 返回含有key1,key2元素的map.
1.4 方法调用时使用命名参数
在方法调用时,可能会用到命名参数。
|
package map.namedarguments class Address { String street, city; } |
|
package map.namedarguments class Person { String name; Address address; String phoneNumber; def moveToNewPlace(inputAsMap,newPhoneNumber) { address.street = inputAsMap.street; address.city = inputAsMap.city; phoneNumber = newPhoneNumber; } } |
|
package map.namedarguments class NamedArguments { static main(args) { def address = new Address(street:"开发区大街",city:"燕郊"); def p = new Person(name:"zuo",address:address,phoneNumber:"18600000000"); assert "zuo" == p.name; assert "18600000000" == p.phoneNumber; assert "开发区大街" == p.address.street; assert "燕郊" == p.address.city; /** * 下边会自动转换为 * [street:"北三环中路",city:"北京"],"15699999999"。其实用此种方式是最好的。 */ p.moveToNewPlace(street:"北三环中路", "15699999999",city:"北京"); assert "zuo" == p.name; assert "15699999999" == p.phoneNumber; assert "北三环中路" == p.address.street; assert "北京" == p.address.city; } } |
所有的命名参数都会被groovy转换为一个map,并且传递到被调用的方法的第一个参数中。剩下的所有参数会被传递到其后的参数中。传递进去后,该方法从map中提取相应的参数。
1.5 list 转 map
使用collectEntries 方法将list转换为map。
|
package map class List2Map { static main(args) { def words = ['a','b','ac','d']; //简单的转换,必须使用it def result = words.collectEntries { [(it):0] } assert result.size() == 4; assert result.a == 0; //下边使用闭包检索包含'a'的元素 def map = words.collectEntries() { [(it):it.contains('a')]; } println map; assert map.a && map.ac && !map.b && !map.d } } |
输出
|
[a:true, b:false, ac:true, d:false] |
contains方法,返回的value是Boolean。
12.Maps的更多相关文章
- [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2
声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...
- (转)Linux core 文件介绍与处理
1. core文件的简单介绍 在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以 ...
- SpringBoot之旅第二篇-配置
一.引言 虽然springboot帮我们进行了自动配置,但配置还是不可避免的,比如最简单的端口号,数据库连接.但springboot的配置一般不用xml进行配置,而是yml和properties,选择 ...
- java开发注解总结笔记
目录 1.最基础注解(spring-context包下的org.springframework.stereotype) 1.1.@Controller @Service @Repository @Co ...
- springboot 配置文件
– Spring Boot使用一个全局的配置文件 • application.properties • application.yml – 配置文件放在src/main/resources目录或者类路 ...
- SpringBoot配置(1) 配置文件application&yml
SpringBoot配置(1) 配置文件application&yml 一.配置文件 1.1 配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的. application ...
- 尚硅谷【SpringBoot】入门
https://www.bilibili.com/video/av20965295/?p=2 缺点: 基于springframe的封装 对framework api需要熟悉 2微服务 2014 ...
- 尚硅谷springboot学习9-配置文件值注入
首先让我想到的是spring的依赖注入,这里我们可以将yaml或者properties配置文件中的值注入到java bean中 配置文件 person: lastName: hello age: 18 ...
- Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解
Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...
随机推荐
- angularjs ng-repeat倒叙
<div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng ...
- lvs+keepalived+nginx高性能负载均衡集群
项目发布时候,别人还能访问呢? 双机主从热备 LVS作用 LVS是一个开源的软件,可以实现传输层四层负载均衡.LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器.目前有 ...
- poj 3617 Best Cow Line 解题报告
题目链接:http://poj.org/problem?id=3617 题目意思:给出一条长度为n的字符串S,目标是要构造一条字典序尽量小,长度为n的字符串T.构造的规则是,如果S的头部的字母 < ...
- mysql优化20条原则
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- Linux GCC常用命令学习
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- [转载]Dalvik指令集
这篇文章是转载的,为了便于查找一些指令,贴在这里. 转自:http://blog.csdn.net/canfengxiliu/article/details/20144119 ------------ ...
- MSD3393/MSD3463 屏参及REG对照表
概述:TIMMING组成 MOD: BANK:0x1032 VOP: SC_BK10 注意BANK对应: VOP: SC_BK10 例如:MS_U16 m_wPanelHTotal; Sub VO ...
- JavaScript-Tool:jquery.vaidate.js
ylbtech-JavaScript-Tool:jquery.vaidate.js 1.返回顶部 1. 2. 3. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https ...
- activeMQ:java消息机制初试(一)
前言:自打学习编程以来,就知道activeMQ这么个东西,但是仅仅限于只知其名,不闻其详.现在加入到新的项目组,项目中使用了这个.现在想重新去学习和了解.最后整合成一个完成的demo,在网上看的Dem ...
- 第一篇:构建第一个SpringBoot工程
简介 spring boot 它的设计目的就是为例简化开发,开启了各种自动装配,你不想写各种配置文件,引入相关的依赖就能迅速搭建起一个web工程.它采用的是建立生产就绪的应用程序观点,优先于配置的惯例 ...