离线下载
PDF版 ePub版

阿拉神农 · 更新于 2018-11-28 11:00:43

Groovy 中的数据类型

Groovy 中的数据类型我们就介绍两种和 Java 不太一样的:

  • 一个是 Java 中的基本数据类型。

  • 另外一个是 Groovy 中的容器类。

  • 最后一个非常重要的是闭包。

放心,这里介绍的东西都很简单

基本数据类型

作为动态语言,Groovy 世界中的所有事物都是对象。所以,int,boolean 这些 Java 中的基本数据类型,在 Groovy 代码中其实对应的是它们的包装数据类型。比如 int 对应为 Integer,boolean 对应为 Boolean。比如下图中的代码执行结果:

int 实际上是 Integer

容器类

Groovy 中的容器类很简单,就三种:

  • List:链表,其底层对应 Java 中的 List 接口,一般用 ArrayList 作为真正的实现类。
  • Map:键-值表,其底层对应 Java 中的 LinkedHashMap。
  • Range:范围,它其实是 List 的一种拓展。

对容器而言,我们最重要的是了解它们的用法。下面是一些简单的例子:

1.List 类

变量定义:List 变量由[]定义,比如

def aList = [5,'string',true] //List 由[]定义,其元素可以是任何对象  

变量存取:可以直接通过索引存取,而且不用担心索引越界。如果索引超过当前链表长度,List 会自动 往该索引添加元素

assert aList[1] == 'string'
assert aList[5] == null //第 6 个元素为空  
aList[100] = 100  //设置第 101 个元素的值为 10
assert aList[100] == 100

那么,aList 到现在为止有多少个元素呢?

println aList.size  ===>结果是 101

2.Map 类

容器变量定义

变量定义:Map 变量由[:]定义,比如

def aMap = ['key1':'value1','key2':true] 

Map 由[:]定义,注意其中的冒号。冒号左边是 key,右边是 Value。key 必须是字符串,value 可以是任何对象。另外,key 可以用''或""包起来,也可以不用引号包起来。比如

def aNewMap = [key1:"value",key2:true] //其中的 key1 和 key2 默认被  

处理成字符串"key1"和"key2" 不过 Key 要是不使用引号包起来的话,也会带来一定混淆,比如

def key1="wowo"
def aConfusedMap=[key1:"who am i?"]
aConfuseMap 中的 key1 到底是"key1"还是变量 key1 的值“wowo”?显然,答案是字符串"key1"。如果要是"wowo"的话,则 aConfusedMap 的定义必须设置成:  
def aConfusedMap=[(key1):"who am i?"]

Map 中元素的存取更加方便,它支持多种方法:

println aMap.keyName    <==这种表达方法好像 key 就是 aMap 的一个成员变量一样  
println aMap['keyName'] <==这种表达方法更传统一点  
aMap.anotherkey = "i am map"  <==为 map 添加新元素  

3.Range 类

Range 是 Groovy 对 List 的一种拓展,变量定义和大体的使用方法如下:

def aRange = 1..5  <==Range 类型的变量 由 begin 值+两个点+end 值表示  
                      左边这个 aRange 包含 1,2,3,4,5 这 5 个值  

如果不想包含最后一个元素,则

def aRangeWithoutEnd = 1..<5  <==包含 1,2,3,4 这 4 个元素  
println aRange.from
println aRange.to

Groovy API 的一些秘笈

前面讲这些东西,主要是让大家了解 Groovy 的语法。实际上在 coding 的时候,是离不开 SDK 的。由于 Groovy 是动态语言,所以要使用它的 SDK 也需要掌握一些小诀窍。

Groovy 的 API 文档位于 http://www.groovy-lang.org/api.html

以上文介绍的 Range 为例,我们该如何更好得使用它呢?

  • 先定位到 Range 类。它位于 groovy.lang 包中:

有了 API 文档,你就可以放心调用其中的函数了。不过,不过,不过:我们刚才代码中用到了 Range.from/to 属性值,但翻看 Range API 文档的时候,其实并没有这两个成员变量。图 6 是 Range 的方法

文档中并没有说明 Range 有 from 和 to 这两个属性,但是却有 getFrom 和 getTo 这两个函数。What happened?原来:

根据 Groovy 的原则,如果一个类中有名为 xxyyzz 这样的属性(其实就是成员变量),Groovy 会自动为它添加 getXxyyzz 和 setXxyyzz 两个函数,用于获取和设置 xxyyzz 属性值。

注意,get 和 set 后第一个字母是大写的

所以,当你看到 Range 中有 getFrom 和 getTo 这两个函数时候,就得知道潜规则下,Range 有 from 和 to 这两个属性。当然,由于它们不可以被外界设置,所以没有公开 setFrom 和 setTo 函数。

上一篇: 一些前提知识 下一篇: 闭包