文档章节

Groove list操作-转数组,collect,each等

SuShine
 SuShine
发布于 2018/08/31 17:48
字数 1083
阅读 56
收藏 0

list转换为数组

List list = ['a','b','c','d']
def strs = list as String[]
println strs[0]

使用了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 = []

     

      list.each{

         result << it*2

      }

 

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

 

      def result = list.collect{it*2}

 

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

 

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

     

      def result = []

 

      list.each{

           if(it>2)

              result << it

       }

 

       println result

   

 

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

   

 

       def result = list.grep{

           it > 2

       }

 

    println result

 

是的,在Groovy语言中,我们对集合元素的过滤一般都使用"grep"方法,这样的代码更加具有Groovy风格一些。具有同样一些功能的方法还有"find(Closure closure)","findAll(Closure closure)"。

 

在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

       }

      

    println isMoreThanZero

 

同样类型的方法还有"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

       };

 

    println count

 

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

 

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

 

       def result = ''

      

       list.each{

           result+=it

       }

 

       println result

   

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

 

       def result = list.join()

 

       println result

   

 

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

本文转载自:https://blog.csdn.net/hivon/article/details/3996722

SuShine
粉丝 130
博文 598
码字总数 158700
作品 0
朝阳
后端工程师
私信 提问
JDK8新特性(3):Stream API补充介绍

之前介绍过stream的部分操作,感觉写的太简单的,示例也太少了,这次再次整理了stream类下大家在工作中会常用的方法。 聚合操作 什么是流 Stream 就如同一个迭代器(Iterator),单向,不可往...

arthur666
2018/08/13
598
2
流,用声明性的方式处理数据集 - 读《Java 8实战》

引入流 Stream API的代码 声明性 更简洁,更易读 可复合 更灵活 可并行 性能更好 流是什么? 它允许以声明方式处理数据集合 遍历数据集的高级迭代器 透明地并行处理 简短定义:从支持数据处理...

yysue
2018/08/15
61
1
死磕Java 8特性系列---流的深入

本次,读了两本书,一本是《Beginning Java 8 Language Features》,一本是《Java 8 实战》,有感。感觉平时我们都是使用了个Java8相关特性的皮毛。加上以前面试被人问:你知道一个列表我想同...

心中的理想乡
2018/09/19
91
1
Java8 Stream详解 & 原理深度解析

Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。 一、流的初始化与转换: Java中的Stream的所有操作都是针对流的,所...

勇恒
2018/06/08
123
0
java8 list转map

List转Map List转Map() List转Map List转Map> doc Ignore duplicates when producing map using streams...

go4it
2016/11/09
183
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
4
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
8
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部