加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy探索 使用集合方法,写出更加Groovy风格的代码

发布时间:2020-12-14 16:52:44 所属栏目:大数据 来源:网络整理
导读:转自:http://www.voidcn.com/article/p-zcbzjwpj-pe.html 使用了Groovy语言,就能时不时的感受到Groovy语言在编码风格上与Java语言的不同。当然,我们首先感受到的可能就是在Groovy语言中无处不在的闭包,其中最最常用的是each方法。 比如,下面的代码段是

转自:http://www.voidcn.com/article/p-zcbzjwpj-pe.html

使用了Groovy语言,就能时不时的感受到Groovy语言在编码风格上与Java语言的不同。当然,我们首先感受到的可能就是在Groovy语言中无处不在的闭包,其中最最常用的是each方法。

比如,下面的代码段是我们在Java语言中常用的遍历风格:

for(int?i=0;i<list.size();i++)

{

?????????? System.out.println(list.get(i));

?}

但是,我们在Groovy语言中常用的遍历风格却是如下的代码段:

??? ? list.each{

?????? ??println?it

? }

?

这种风格,已经让我强烈感受到了Groovy语言编码的快捷性。但是,我们,对于长期使用Java语言的我们来说,Groovy语言在许许多多的地方表现出它的风格,但我们由于使用Java语言的惯性,未必能很自然的使用它们。

比如,我们有如下的一个集合对象:

?

??? ??def?list = [1,2,3,4]

现在,我们需要得到一个集合对象,它的每一个元素是上面的list对象的每一个元素的两倍。我们从Java语言过来的人很容易写出如下的代码来:

??? ??def?result = []

??? ?

?????? ? result << it*2

??? ? }

我们可能会洋洋自得,我们的each方法使用的不错,代码比起Java语言来简单得多了。但实际上,Groovy语言为我们准备了更加简单的方法,这就是Groovy语言风格的集合方法--collect方法。

??? ??def?result = list.collect{it*2}

可以看到,只有一个语句行,就代替了上面的三个语句行。这就是我们Groovy风格的代码,同样的方法还有"collect(Collection?collection,?Closure?closure)","collectAll(Closureclosure)"和"collectAll(Closure?closure)"。

还是上面的list对象,比如,我们想找出该对象中所有大于2的元素来,我们的Java语言风格应该是这样的:

???????????if(it>2)

????????????? result << it

?????? }

???????println?result

???

但是,这种过滤,在Groovy语言中,同样可以找到集合方法来代替它,使得代码更加具有Groovy语言风格:

???

???????def?result = list.grep{

?????????? it > 2

????println?result

是的,在Groovy语言中,我们对集合元素的过滤一般都使用"grep"方法,这样的代码更加具有Groovy风格一些。具有同样一些功能的方法还有"find(Closure?closure)","findAll( 在Java语言中,对List的遍历方法是万能的,我们要做的一切功能都必须从遍历方法开始。比如,我们想知道上面的list对象是否所有的元素都大于0。在Java语言中,我们会写出如下的代码:

???????boolean?isMoreThanZero =?true;

???????for(int?i?in?list)

?????? {

???????????if(i<=0)

?????????? {

????????????? isMoreThanZero =?false;

??????????????break;

?????????? }

??????

????println?isMoreThanZero

在Groovy语言中,同样有Groovy风格的方法来帮我们省掉一大段的代码,这就是"every"方法:

???????def?isMoreThanZero = list.every{

?????????? it>0

同样类型的方法还有"any(Closure?closure)","any()"和"every()"。

除了上面的一些Groovy风格的代码,我们还有难度更大一些的Groovy语言风格的方法,比如注入方法--"inject"。

比如,我们想把list对象的所有元素相加起来,然后再和10求和。Java语言的编码风格看起来如下:

???????def?count?= 10

??????

?????? list.each{

???????????count+=it

????println?count

?

但Groovy语言风格的代码看起来如下所示:

???????def?count?= list.inject(10){result,it->

?????????? result+it

?????? };

类似这样的注入方法,Groovy语言还有集合方法"count(Object?value)"。

还有一个集合方法,对于字符串特别好用。比如,我们想把上面的list对象的所有元素连接成一个字符串。Java语言的风格是这样的:

???????def?result = ''

?????????? result+=it

Groovy语言风格的代码则是如下:

???????def?result = list.join()

好了,就举出这么多了,都是一些集合方法配合闭包来使用而形成的Groovy语言风格的代码,写起来既快捷又简约,体现出Groovy语言作为动态语言的特点来。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读