Groovy VS Java 之Collection----List

Groovy不按照顺序学习了!介于Groovy实现了Java的所有语法!所以比较着来看!顺便复习复习Java基础知识。
在Java里面用的比较多的类应该就是集合类了,所以先从这里开始学习。
参考资料:《Thinking in Java第四版》,第11章
Pragmatic.Bookshelf.Programming.Groovy.Apr.2008 ,第7章

对于Java来说:
Java容器类的用途是“保存对象”,并将其划分为两个不同的概念:
1)Collection.以后让独立元素的排列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,Set不能有重复元素。QUeue按照排队规则来确定对象产生的顺序。
2)Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字和对象关连在了一起。
(摘自《Thinking in java》 11.2)

而对于Groovy来说:
Groovy同样的拥有List和Map,但是操作方法比Java要简单很多。

首先是List:
在Java中,只要实例化对象,那就需要new关键字,List也不例外!
List可以将元素维护在特定的序列中。
有两种类型的List:
基本的ArrayList:长于随机访问元素,但是插入和移除元素较慢。
LinkedList与之相反。但是提供了比ArrayList更大的特性集。(摘自《Thinking in java》 11.5)
例子就免了。

在Groovy中就简单了很多,你要一个list,只需要这样。

lst = [1,2,3,4,5,6,7,8,9]

乍看之下是个数组。但是调用下面的方法,你会发现,其实这是一个ArrayList.

println lst.getClass().name

如果需要打印所有的元素,直接打印即可

println lst

如果你想要答应单个的元素,就使用下标(又像Java的数组了)

println lst[0]

下标也是从0开始的。
当你想得到这个list的最后几个元素的时候你该怎么办呢?你不需要写类似list.size()这样的语句。Groovy支持下标为负数,表示从末尾开始。

println lst[-1]
println lst[-2]

再或者,你想取得下标从1-5的所有元素,你也不需要循环。

println lst[1..5]

在这里有一个地方需要注意的,看下面的代码

lst = [1,2,3,4,5,6,7,8,9]
sub = lst[1..5]
println sub
sub[0] = 10
println sub
println lst

当你修改了sub的值,lst的对应值也会改变。所以sub得到的不是对应的一个拷贝。操作的是和lst相同的list.

Groovy以闭包的方式提供了list的循环操作。比如,你想要循环lst,打印出所以的奇数。

lst = [1,2,3,4,5,6,7,8,9]
lst.each {if(it%2 != 0) println it}

这个类似于JDk1.5里面提供的foreach循环

for(Integer i : lst){
...
}

代码里的it相当于这里的i,只是这个名称是固定的。当然了,你也可以修改,不过需要这么写。

lst.each {ss->if(ss%2 != 0) println ss}


对于list间的拷贝。Groovy提供了<<操作符。

lst = [1,2,3,4,5,6,7,8,9]
doubled = []
lst.each {doubled << it * 2 }
println doubled

对于上面的操作,可以使用collect来简化。

doubled = lst.collect { it * 2 }
println doubled

collect和each类似,但是collect会返回一个list。
你如果要查找某个元素,那么就需要find。

println lst.find { it == 2 }

find会返回第一个数值为2的元素。如果想要查找所有的数值为2的元素,那么用findAll.

println lst.findAll { it == 2 }

是不是感觉findAll和collect有点重复,看看下面的代码,看看打印的是什么吧。

println lst.collect { it == 2 }

Groovy对Collection还提供了一些简便易用的方法。以简化下面的程序为例来一一说明。

lst = ['Programming' , 'In' , 'Groovy' ]
count = 0
lst.each { count += it.size() }
println count

这个程序用来计算lst里面的字符串的总长度。
可以一句话来解决。

println lst.collect { it.size() }.sum()

上面提到了,collect会返回一个list,这里返回的list,包含的是lst里面的各个字符串的长度,再调用sum()方法,求得长度的和。
你还可以这样来写

println lst.inject(0) { carryOver, element -> carryOver + element.size() }

inject闭包会循环lst的所有元素,第一次,会将0赋值给carryOver,并计算carryOver+element.size(),并再循环第二个元素的时候,将计算的结果赋值给carryOver,一直到循环结束。
如果需要将lst以字符串的形式展现

println lst.join(' ' )

如果要添加元素

lst[0] = ['Hello' , ',' ]
println lst

这里打印结果是

[["Hello" , "," ], "Ivan"]

可以使用flatten使之平坦化。

lst = lst.flatten()
println lst

打印结果

["Hello" , "," , "Ivan"]

平坦化后,试试看

println lst-["Hello"]

如果没有平坦化,再看看是什么结果。
比较下面两行代码的区别

println lst.size() //3
println lst*.size() //[5,1,4]

最后,如果有一个方法是这样的

def words(a, b, c)
{
println "$a $b $c"
}

你要把lst传进去,需要这样写

words(*lst)

这里,words里面的参数个数必须要和lst的长度相同。

其实这里很多方法都可以用一个方法来解决,只是代码量会增多。
提供这么多的方法的原因应该就是为了简化操作吧。Groovy是敏捷的Java嘛!也有可能是借鉴Ruby吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值