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的更多相关文章

  1. [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2

    声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...

  2. (转)Linux core 文件介绍与处理

    1. core文件的简单介绍 在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以 ...

  3. SpringBoot之旅第二篇-配置

    一.引言 虽然springboot帮我们进行了自动配置,但配置还是不可避免的,比如最简单的端口号,数据库连接.但springboot的配置一般不用xml进行配置,而是yml和properties,选择 ...

  4. java开发注解总结笔记

    目录 1.最基础注解(spring-context包下的org.springframework.stereotype) 1.1.@Controller @Service @Repository @Co ...

  5. springboot 配置文件

    – Spring Boot使用一个全局的配置文件 • application.properties • application.yml – 配置文件放在src/main/resources目录或者类路 ...

  6. SpringBoot配置(1) 配置文件application&yml

    SpringBoot配置(1) 配置文件application&yml 一.配置文件 1.1 配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的. application ...

  7. 尚硅谷【SpringBoot】入门

    https://www.bilibili.com/video/av20965295/?p=2 缺点: 基于springframe的封装    对framework api需要熟悉 2微服务 2014 ...

  8. 尚硅谷springboot学习9-配置文件值注入

    首先让我想到的是spring的依赖注入,这里我们可以将yaml或者properties配置文件中的值注入到java bean中 配置文件 person: lastName: hello age: 18 ...

  9. Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解

    Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...

随机推荐

  1. 物体position:absolute后设置left:50%发生的有趣小事

    今天在重构ui控件中3秒hint提示框样式,发现了一个有趣的小事,特发个文章记录一下,方便自己日后看一下 一 准备知识 ①一个已设置宽高的块状元素设置position:absolute后会保持他原来宽 ...

  2. codevs 1155今明的预算方案(复习有依赖性的背包问题)

    1155 金明的预算方案 [题目大意]买附件必须买主件. 在一定钱数内 求总价值最大. [题解]有依赖性的背包问题. [code] #include<iostream> #include& ...

  3. bzoj 3527 [Zjoi2014] 力 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 看了看TJ才推出来式子,还是不够熟练啊: TJ:https://blog.csdn.n ...

  4. HDU1496(巧妙hash)

    Equations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. dcos下rexray服务的配置

    在dcos环境下,rexray服务的默认配置文件为/opt/mesosphere/etc/rexray.conf,而其服务文件则是 /etc/systemd/system/dcos-rexray.se ...

  6. 九、myeclipse开发背景保护色设置

    window->preferences->Editors->Text Editors->Background color 背景颜色向你推荐: 色调:85.饱和度:1 2 3.亮 ...

  7. Java创建对象解释

    创建对象包括两个步骤,首先为对象声明,然后为对象分配内存. (1)对象声明 格式:类名 对象名: 这里只是声明了对象,但该对象并不能够使用,原因为未分配内存空间. (2)为对象分配内存 格式:new ...

  8. MFC绘制直角坐标系

    void CMyPicoTestDlg::DrawWave(CDC *pDC,CRect &rectPicture) { CPen newPen; //用于创建新画笔 CPen *pOldPe ...

  9. Algorithm-4th part I 学习进度 (7/12)

    在cousera跟着书的原作者学习<算法>第四版.记录以下学习进度. 课后习题代码见我的GitHub 2018.09.22 : Priority Queues 使用完全二叉树实现优先队列 ...

  10. Walk of Length 6

    简要题意: 给一n(n<=2000)个点的有标号无向图,在图上从1出发走六步回到1,问有多少种不是六元简单环的情况. 解法: 用暴力找到31种走法,环有9种形状: 分为9种,统计出每一种情况的方 ...