Groovy(四)-布尔值,Lists,Arrays,Maps

译文:Groovy Language Documentation

布尔值
布尔值是一种用来表示真值:true和false的特殊数据类型。用这种数据类型可以设置简单的标志位来跟踪true/false情况。

布尔类型可以保存在变量中,赋值给属性,跟其他数据类型一样:

def myBooleanVariable = true
boolean untypedBooleanVar = false
booleanField = true

true和false是仅有的两种原始boolean值,更加复杂的布尔表达式可以用逻辑运算符来表达。

另外,groovy有一些特殊的规则(通常对于Groovy中的真值)来使非boolean对象转化为boolean对象。

Lists
Groovy使用点来分隔一串数值,并且用中括号括起来来表示list集合。Groovy的list集合是java的jdkjava.util.List,因为groovy没有提供自己的集合类。具体的list实现是在定义list常量的时候,默认是java.util.ArrayList,除非你想自己指定另外的类型,我们接下来就会看到。

def numbers = [1, 2, 3]         1

assert numbers instanceof List  2
assert numbers.size() == 3      3

1.我们用逗号来划分一组数字,并且用中括号来包括,最后赋值给常量。
2.这个集合是java中java.util.List接口的实例。
3.集合的大小可以用方法size()来询问。最终回返回这个集合有三个元素。

在上面的例子中,我们的集合元素都是同类型的。但是你能创建一个包含不同类型元素的集合。

def heterogeneous = [1, "a", true]   1

1.集合中包含一个数字类型,一个字符类型,一个布尔类型的元素。

前面我们提到过,我们的集合默认是java.util.ArrayList实例,但是也可以使用as操作符来强制使它转化为另外一种集合类型。或者明确指明一种类型。

def arrayList = [1, 2, 3]
assert arrayList instanceof java.util.ArrayList

def linkedList = [2, 3, 4] as LinkedList                1
assert linkedList instanceof java.util.LinkedList

LinkedList otherLinked = [3, 4, 5]                      2
assert otherLinked instance java.util.LinkedList

1.我们可以使用as操作符来明确指明实现java.util.LinkedList.
2.我们能说这个变量里面保存着java.util.LinkedList类型的集合常量。

你可以用[]操作符然后里面带上正数或者负数来访问集合中(用来取值或者设置值)的元素,其中正数或者负数是表示从集合的头开始还是尾部开始算,或者代表一个集合范围。而且可以使用<<来往集合中添加元素。

def letters = ['a', 'b', 'c', 'd']

assert letters[0] == 'a'     1
assert letters[1] == 'b'

assert letters[-1] == 'd'    2
assert letters[-2] == 'c'

letters[2] = 'C'             3
assert letters[2] == 'C'

letters << 'e'               4
assert letters[ 4] == 'e'
assert letters[-1] == 'e'

assert letters[1, 3] == ['b', 'd']         5
assert letters[2..4] == ['C', 'd', 'e']    6

1.访问集合中的第一个元素,集合是从零开始算的。
2.使用-1来访问集合的话代表是访问集合尾部开始算第一个元素。
3.使用赋值符来给集合中的第三个元素进行设值。
4.使用<<操作符来往集合的最后添加元素。
5.同时给集合中的两个位置设置新的值,返回一个带有这两个新值的集合。
6.使用一个范围来访问集合中的元素,表示从2开始,到4位置结束。

就像集合中可以包含多种类型的元素一样,集合中也可以包含另外的集合来创建一个多维的集合。

def multi = [[0, 1], [2, 3]]     1
assert multi[1][0] == 2          2

1.定义一个多维的数字集合。
2.访问第二个集合中的第一个元素。

数组
Groovy重用了集合中的表示方法来表示数组。但是对于数组类型的变量,你需要通过强制转化或者明确指明来确定数组类型。

String[] arrStr = ['Ananas', 'Banana', 'Kiwi']  1

assert arrStr instanceof String[]    2
assert !(arrStr instanceof List)

def numArr = [1, 2, 3] as int[]      3

assert numArr instanceof int[]       4
assert numArr.size() == 3

1.明确指明字符类型数组的类型。
2.断言说我们创建的事字符类型的数组。
3.使用as操作符来创建一个int类型的数组。
4.断言说我们创建了一个int基本类型的数组。

你也可以创建多维数组:

def matrix3 = new Integer[3][3]         1
assert matrix3.size() == 3

Integer[][] matrix2                     2
matrix2 = [[1, 2], [3, 4]]
assert matrix2 instanceof Integer[][]

1.你能定义一个新数组的大小。
2.或者你可以创建一个没有明确大小的数组。

使用以下标记来访问集合中的元素:

String[] names = ['Cédric', 'Guillaume', 'Jochen', 'Paul']
assert names[0] == 'Cédric'     1

names[2] = 'Blackdrag'          2
assert names[2] == 'Blackdrag'

1.取出数组中的第一个元素。
2.设置数组中的第三个元素为新元素。

注意: Groovy不支持java中数组初始化的方法,因为java中的{}跟Groovy中的闭包会混淆。

Maps
通常在其他语言中我们叫字典或者关联数组,但是在groovy中我们称作map,map是键值对关联,键和值之间用:隔开,而且每个键值对之间用逗号隔开,整个map用中括号[]包含。

def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']   
 1
assert colors['red'] == '#FF0000'    2
assert colors.green  == '#00FF00'    3

colors['pink'] = '#FF00FF'           4
colors.yellow  = '#FFFF00'           5

assert colors.pink == '#FF00FF'
assert colors['yellow'] == '#FFFF00'

assert colors instance java.util.LinkedHashMap

1.我们定义了一个以颜色名称为key,以十六进制颜色值为value的map集合。
2.我们使用下标索引的方式来看key为red对应的value值。
3.我们使用属性索引的方式来看green对应的十六进制值。
4.同样,我们可以通过下标索引的方式来添加一个键值对。
5.或者属性索引的方式来添加一个yellow的颜色。

注意:当我们用名称来当作key,要确保map中有这个名称对应的key。Groovy中创建的map集合实际上是java.util.LinkedHashMap的实例。

如果你访问了一个不存在的key:

assert colors.unknown == null

你将得到一个null值。

在上面的例子中我们都是使用字符作为key,其实我们也可以使用其他类型来作为key。

def numbers = [1: 'one', 2: 'two']

assert numbers[1] == 'one'

这里,我们将数字作为键,因为数字可以明确被识别为数字,所以在前面的例子中groovy不会创建一个字符类型的key。但是想象一种场景,你会传一个变量来代替key,这个变量所代表的值变成了key。

def key = 'name'
def person = [key: 'Guillaume']      1

assert !person.containsKey('name')   2
assert person.containsKey('key')     3

1.key对应的'Guillaume'的键就是key这个字符串,而不是key变量所代表的name字符串。
2.这个map没有包含name这个key。
3.这个map包含了key这个键。

注意:你可以通过省略引号的字符串或者像这样["name": "Guillaume"],但是如果你的key不是合法的标识符时,你必须添加上引号,像这里一样["street-name": "Main street"].

当你想要传一个变量或者表达式作为key时,你必须添加上()

person = [(key): 'Guillaume']        1

assert person.containsKey('name')    2
assert !person.containsKey('key')    3

1.我们使用()括号来包含一个变量。说明我们不是为了声明一个key字符的键,而是传一个key的变量作为键。
2.这个map包含了name的键。
3.这个map没有包含key字符作为键。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • groovy是什么 Groovy 是下一代的Java语言,跟java一样,它也运行在 JVM 中。 作为跑在JVM...
    ronaldo18阅读 655评论 0 4
  • 什么是 Groovy? 简言之,Groovy是一种基于JVM(Java虚拟机)的敏捷动态开发语言。它是一种成熟的面...
    北纬26阅读 4,065评论 0 14
  • 今天平安夜,大家都在过节很开心吧?有人说这是洋人的节日,我们为什么要这样捧场?但也有人需要些噱头制造些快乐。但可能...
    桃花123阅读 165评论 0 0