Groovy代码示例 – map

map的定义

map一般用于key-value键值对的存放。在groovy中你可以使用两种方式定义map:

  • 1)定义一个空map然后再存放key-value键值
  • 2)直接定义带有初始值的map

可以对比一下两种方式的差别和用法。

//定义一个空的map
def emptyStudentMap = [:]
println emptyStudentMap // [:]

//定义带有初始值的map
def studentMapWithInitialValue = [name: "John", surname: "Doe", age: 17]
println studentMapWithInitialValue // [name:John, surname:Doe, age:17]

需要注意的是[]中的冒号:,表明这是一个map而不是list

而对于map中的初始值,key值是不需要双引号""的,默认都是字符串类型。

map中添加键值对

groovy中添加键值对可以采用多种方式,操作起来十分方便,具体请看以下代码:

def student = [:] // 定义一个空的map
student.put('name', 'John') // java语法的方式添加键值对
student['surname'] = 'Doe' // 也可以使用中括号的方式添加键值对
student << [age: 17] // 这种方式类似于unix的重定向符号,将键值对放到map中
student.class = "11C" //使用.点号的方式也是可以的
student.'school' = "Groovy School" //同上面类似,但是可以放一些特殊符号

println student // [name:John, surname:Doe, age:17, class:11C, school:Groovy School]

map中删除键值对

从map中删除键值对像添加一样简单,你可以用以下几种方式删除。

def student = [name: 'John', surname: 'Doe', age: 17, class: '11C', school: 'Groovy School']
println student // [name:John, surname:Doe, age:17, class:11C, school:Groovy School]

//使用remove方法删除
student.remove('age') // Remove by key
println student // [name:John, surname:Doe, class:11C, school:Groovy School]

//使用减法删除,不会改变原map
student = student - [school: 'Groovy School'] // This is something like arithmetic operation
println student // [name:John, surname:Doe, class:11C]

map获取值为null时返回默认值

有时候,我们需要对于map中的返回值调用函数,如果返回值为null的时候会报NullPointerException。为了避免出现这个异常,需要检查是否为null。groovy为了避免我们获取到null,提供了方法当返回值为null时,自动返回默认值。请参考以下代码:

def student = [name: 'John', surname: 'Doe', age: 17, class: '11C', school: 'Groovy School']

//map中不存在key为'teacher'的键值对,所以返回new Teacher(name : "Betty")
def result = student.get('teacher', new Teacher(name: "Betty"))

println result // Teacher(name:Betty)

上面的例子中,map中不存在’teacher’所以返回new Teacher(),因此不需要我们考虑NullPointerException的处理。

map合并

groovy中的map合并也是非常简单,就像字符串连接那样。

def studentProp1 = [name: 'John', surname: 'Doe']
def studentProp2 = [age: 17, class: '11C']
def studentProp3 = [school: 'Groovy School']

//使用加法合并多个map
def student = studentProp1 + studentProp2 + studentProp3

//合并后的结果
println student // [name:John, surname:Doe, age:17, class:11C, school:Groovy School]

map对象合并在groovy中可以很容易实现,代码示例如下:

1)使用+号

assert [ a: true, b: false ] + [ a: false ] == [ a: false, b: false ]

2)或者使用左移操作,代码示例如下:

assert [ a: true, b: false ] << [ a: false ] == [ a: false, b: false ]

两者的区别是:

  • 左移操作是把右边的map合并到左边的map中,改变了左边map的内容
  • 使用+则根据左边的map创建了一个新的map,并将右边的map合并到新map中

获取两个map的交集

有时候当你需要在不同的map中查找相同键值对的时候,groovy为了提供了方便的方法获取map交集。

def student1 = [name: 'John', surname: 'Doe', age: 17]
def student2 = [surname: 'Bunny', age: 17]

//获取student1和student2的交集
def sameProperties = student1.intersect(student2) // [age: 17]

println sameProperties // [age:17]

以上代码会找出student1和student2两个map的键值对交集。容易发现age:17是两个map都有的键值对,交集为[age:17]

获取map的键(key)集合与值(value)集合

groovy中可以像java中那样获取map的键、值的集合。

def student = [name: 'John', surname: 'Doe', age: 17]

//获取键key集合
def studentKeys = student.keySet() // [name, surname, age]
println studentKeys // [name, surname, age]

//获取值value集合
def studentValues = student.values() // [John, Doe, age]
println studentValues // [John, Doe, 17]
上一篇 Groovy代码示例 - collect()方法
下一篇 Groovy代码示例 - 变量variable及类型转换
目录
文章列表
1 iOS热修复框架JSPatch
iOS热修复框架JSPatch
2
Kubernetes通过yaml创建命名空间
Kubernetes通过yaml创建命名空间
3
React.js集成Antd组件库
React.js集成Antd组件库
4
高中数学基础:随机变量及其分布
高中数学基础:随机变量及其分布
5
TinkerPatch SDK API
TinkerPatch SDK API
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。