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,只需要这样。
乍看之下是个数组。但是调用下面的方法,你会发现,其实这是一个ArrayList.
如果需要打印所有的元素,直接打印即可
如果你想要答应单个的元素,就使用下标(又像Java的数组了)
下标也是从0开始的。
当你想得到这个list的最后几个元素的时候你该怎么办呢?你不需要写类似list.size()这样的语句。Groovy支持下标为负数,表示从末尾开始。
再或者,你想取得下标从1-5的所有元素,你也不需要循环。
在这里有一个地方需要注意的,看下面的代码
当你修改了sub的值,lst的对应值也会改变。所以sub得到的不是对应的一个拷贝。操作的是和lst相同的list.
Groovy以闭包的方式提供了list的循环操作。比如,你想要循环lst,打印出所以的奇数。
这个类似于JDk1.5里面提供的foreach循环
代码里的it相当于这里的i,只是这个名称是固定的。当然了,你也可以修改,不过需要这么写。
对于list间的拷贝。Groovy提供了<<操作符。
对于上面的操作,可以使用collect来简化。
collect和each类似,但是collect会返回一个list。
你如果要查找某个元素,那么就需要find。
find会返回第一个数值为2的元素。如果想要查找所有的数值为2的元素,那么用findAll.
是不是感觉findAll和collect有点重复,看看下面的代码,看看打印的是什么吧。
Groovy对Collection还提供了一些简便易用的方法。以简化下面的程序为例来一一说明。
这个程序用来计算lst里面的字符串的总长度。
可以一句话来解决。
上面提到了,collect会返回一个list,这里返回的list,包含的是lst里面的各个字符串的长度,再调用sum()方法,求得长度的和。
你还可以这样来写
inject闭包会循环lst的所有元素,第一次,会将0赋值给carryOver,并计算carryOver+element.size(),并再循环第二个元素的时候,将计算的结果赋值给carryOver,一直到循环结束。
如果需要将lst以字符串的形式展现
如果要添加元素
这里打印结果是
可以使用flatten使之平坦化。
打印结果
平坦化后,试试看
如果没有平坦化,再看看是什么结果。
比较下面两行代码的区别
最后,如果有一个方法是这样的
你要把lst传进去,需要这样写
这里,words里面的参数个数必须要和lst的长度相同。
其实这里很多方法都可以用一个方法来解决,只是代码量会增多。
提供这么多的方法的原因应该就是为了简化操作吧。Groovy是敏捷的Java嘛!也有可能是借鉴Ruby吧!
在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吧!