`
Ivan_Pig
  • 浏览: 388280 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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吧!
3
0
分享到:
评论
1 楼 JohnnyJian 2009-01-05  
引用
println lst.collect { it.size() }.sum()

也可以写成:
println lst.sum { it.size() }

相关推荐

    groovy-and-java-8

    在 Groovy 中,你可以直接写 `list.add(item)` 而不是 Java 中的 `list.add(item);`。这种简洁性使得 Groovy 代码更易读,更少出错。 Java 8 的一个重大改进是引入了 Lambda 表达式,这是一种匿名函数,可以作为...

    groovy-scala-extension-module:Groovy的扩展模块,可轻松与Scala类型集成

    Groovy Scala扩展模块 ... java.util.Collection.toScalaList()产生一个scala.collection.immutable.List java.util.Collection.toScalaSet()产生一个scala.collection.immutable.Set java.util.Co

    Java进阶路线

    - **MVC**:模型-视图-控制器模式,是Java Web开发中最常用的设计模式之一。 - **DNS, HTTP, Cookie**:网络协议和客户端状态管理的基础知识。 - **Servlet API**:Java Web 应用的核心组件。 - **FreeMaker/...

    java7api

    Java 7提供了对动态语言的支持,主要是为了Java虚拟机(JVM)上的其他语言如Groovy、JRuby等提供更好的运行环境。通过`invokedynamic`指令,可以实现更灵活的调用机制。 以上只是Java 7 API中的一部分重要特性,...

    Gson解析复杂Json实例,超简单

    Type collectionType = new TypeToken&lt;List&lt;User&gt;&gt;(){}.getType(); List&lt;User&gt; users = gson.fromJson(jsonString, collectionType); // 遍历并打印用户信息 for (User user : users) { System.out.println("Name:...

    java 1.7 chm

    9. **集合接口的新方法**:如`Collection.forEach()`,`Map.forEach()`,`List.removeIf()`等,使得对集合的迭代和操作更为方便。 10. **动态语言支持**:Java 7引入了JSR 292,支持在Java虚拟机上运行其他动态语言...

    基础篇.pdf

    除了Java,JVM还支持Kotlin、Groovy、JRuby、Jython、Scala等其他语言。值传递和引用传递是参数传递的两种方式,Java中所有参数传递都是值传递,即使是对象也是对象引用的副本。 Java的基本数据类型有8种,包括整型...

    struts2标签介绍

    - **用途**:用于遍历集合(`java.util.Collection`)或枚举值(`java.util.Iterator`)。 - **参数**: - `status`:如果设置了该参数,则会创建一个`IteratorStatus`实例,并在每次迭代过程中压入栈中,为可选项...

    JDK1.7api开发手册

    这为Java与Groovy、JRuby等动态语言的集成提供了基础。 7. **Fork/Join框架(Fork/Join Framework)** 为了优化并行计算,JDK 1.7引入了Fork/Join框架,它基于工作窃取算法,可以将大型任务分解为子任务并并行执行...

    spring-boot-security-jpa:Spring Boot的初始设置

    public Collection&lt;? extends GrantedAuthority&gt; getAuthorities() { return authorities.stream().map(GrantedAuthority::new).collect(Collectors.toList()); } // ... } ``` 创建一个`UserRepository`,继承...

    JDK5.CHM和JDK6.CHM 中文版

    2. **动态语言支持**:通过Java Dynamic Language Toolkit (JDT) 支持了动态语言,如Groovy和Ruby。 3. **JSR 223:脚本引擎**:使得在Java中运行JavaScript和其他脚本语言变得简单。 4. **NIO.2(New I/O 2)**:...

    springboot所数据源链接mongodb

    ```groovy implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' ``` 接下来,我们需要在`application.properties`或`application.yml`配置文件中设置MongoDB的相关连接信息。例如: ```...

    使用GORM构建Spring Boot应用程序 Grails指南_ Grails框架.pdf

    如果你想要从零开始,可以使用Spring Initializr创建一个新的Spring Boot项目,选择Gradle作为构建工具,使用Groovy语言,并且指定Spring Boot的版本为1.5.6.RELEASE。同时,确保添加Web和H2数据库依赖项。 接下来...

    Struts2常用标签

    Struts2的一个显著特点是支持多种表达语言,包括OGNL(Object-Graph Navigation Language)、JSTL(JavaServer Pages Standard Tag Library)、Groovy以及Velocity,这比Struts1.x仅支持EL(Expression Language)...

    spring-framework-reference-4.1.2

    3.5. Groovy Bean Definition DSL .............................................................................. 18 3.6. Core Container Improvements ........................................................

    Spring启动mongodb

    在Java开发领域,Spring Boot框架以其便捷的配置和快速的应用启动而广受欢迎。MongoDB则是一种流行的NoSQL数据库,以其灵活性、高性能和易扩展性在大数据处理和文档型数据存储中占据重要地位。当我们需要在Spring ...

    Android仿微信长按菜单效果

    ```groovy dependencies { // ... compile 'com.noober.floatmenu:common:1.0.2' } ``` 之后,你需要在你的Activity中重写`dispatchTouchEvent`方法来捕获长按事件。创建一个`Point`对象来存储长按位置: ```...

    spring-framework-reference4.1.4

    3.5. Groovy Bean Definition DSL .............................................................................. 18 3.6. Core Container Improvements ........................................................

Global site tag (gtag.js) - Google Analytics