`
txf2004
  • 浏览: 7042299 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy探索之Gpath和List的结合 更加Groovy风格的代码

阅读更多

Groovy探索之Gpath和List的结合 更加Groovy风格的代码

在使用Groovy语言的日子里,我常常都被一些Groovy的风格所惊喜着。如闭包、each等方法、Gpath、Map参数等等,等等。我不知道其他动态语言是否也具有这样的一些风格,但起码这些风格是区别于Java语言的风格。我是多年的Java程序员,遇到这些简单、易懂的风格,难免会惊喜不已。

很多的Groovy语言风格我们很容易接受,如each方法,Gpath语句。

比如,我们有了如下的一个List对象:

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

我们在Groovy语言里要遍历这个list对象,我们肯定会轻松的使用下面的each方法:

list.each{

println it

}

而不会使用下面的for循环:

for(int it in list)

{

println it

}

这些都是非常简单和明了的,就像我们会使用了Gpath语句,谁还会使用对于Bean对象的属性操作的"set"和"get"方法呢?

但是有一些Groovy语言风格的代码,却不是那么容易写得出来,特别是对于我们这些Java程序员来说。

但是,我们一旦学会的那些Groovy语言风格的代码,却会给我们带来更大、更多的惊喜。而这些本文所要说到的。

正如标题所言,我们今天要说到的Groovy语言风格的代码,是结合了List对象的一些方法和Gpath语句的代码。

比如,我们有如下的一个Map对象,用来表示一些城市和她们所在的国家:

def cities = ['Shanghai':'China','New York':'USA','Pairs':'France','Beijing':'China']

现在,我们想知道在这个Map对象中,所在国为中国的城市有哪些?在Java语言中,我们会毫不犹豫的写出如下的代码:

def citiesInChina = []

cities.each{

if(it.value=='China')

{

citiesInChina << it.key

}

}

println citiesInChina

而在Groovy语言中,我们的具有Groovy语言风格的代码应该是如下的形式:

def citiesInChina = cities.findAll{

it.value == 'China'

}.collect{it.key}

println citiesInChina

从上面的代码,我们可以初步的看到集合方法和Gpath结合起来的代码风格的威力。但这还不是最经典的例子。

比如我们有如下的一些GroovyBean:

class Book {

String name

List authors

}

class Author {

String name

Address addr

}

class Address {

String province

String city

}

上面的GroovBean的层次结构有点复杂,简单说来就是:一本书有一个或多个作者,每一个作者又都有属于自己的地址。现在,我们有如下的一个初始化数据:

def addr1 = new Address(province:'Guangdong',city:'Shenzhen')

def addr2 = new Address(province:'Gunagdong',city:'Guangzhou')

def addr3 = new Address(province:'Hunan',city:'Changsha')

def addr4 = new Address(province:'Hubei',city:'Wuhan')

def books = [new Book(name:'A glance at Java',authors:[new Author(name:'Tom',addr:addr1)]),

new Book(name:'Deep into Groovy',authors:[new Author(name:'Tom',addr:addr1),new Author(name:'Mike',addr:addr3)]),

new Book(name:'A compare of Struts and Grails',authors:[new Author(name:'Wallace',addr:addr4),new Author(name:'Bill',addr:addr2)]),

new Book(name:'learning from Groovy to Grails',authors:[new Author(name:'Wallace',addr:addr3)])]

在上面的数据中,books变量是由多本书组成,而那些书,有的有一个作者,有的有多个作者,但每个作者都有他自己的地址。

现在,我们想找出作者是"Tom"的书籍的书名。在Java语言中,我们就会有如下形式的代码:

def booksOfTom = []

books.each{

def book = it

def aus = it.authors

aus.each{au->

if(au.name=='Tom') booksOfTom<<book.name

}

}

println booksOfTom

但是,上面的需求,在Groovy语言中是如下风格的代码:

def booksOfTom = books.grep{

it.authors.any{it.name=='Tom'}

}.name

println booksOfTom

首先,对"books"使用"grep"方法,最后得到的结果应该是一个"Book"对象的集合,再对该集合取"name",在这里,".name"相当于"*.name"。

在"grep"方法内部,"it.authors"取得了所有的作者,然后再通过"any"方法来遍历作者名为"Tom"的"Book"对象。

这就是结合集合方法和Gpath的Groovy代码风格,开始学起来有一定的难度,但是理解之后,这种代码风格、这种方法十分好用。下面再举一例。

比如,我们想取得作者是"Wallace"的作者所在的城市(这里有重名的作者)。Java语言的编码风格应该是这样的:

def citiesOfWallace = []

books.each{

def book = it

def authors = it.authors

authors.each{

author->

if(author.name == 'Wallace')

{

def addr = author.addr

citiesOfWallace << addr.city

}

}

}

println citiesOfWallace

但是Groovy语言却会写出如下风格的代码来:

def citiesOfWallace = books.authors.flatten().grep{

it.name == 'Wallace'

}.addr.city

println citiesOfWallace

"books.authors"的结果是一个集合对象,它里面是由四个集合对象组成,这四个集合对象中的每一个集合对象都是由"Author"对象组成。因此对它们进行"flatten"方法,直接获得一个集合对象,由"Author"对象组成。

然后再进行"Author"对象的"name"属性是否为"Wallace"的匹配,匹配完成,得到一个由"Author"对象组成的集合对象。

最后进行取".addr.city",得到一个由"city"组成的集合。也就是需要的结果。

分享到:
评论

相关推荐

    groovy-all

    5. **Groovy GDK (Groovy Development Kit)**: 扩展了Java标准库,提供了更多的便利方法和类,使Groovy代码更加简洁易读。 6. **GPars (Groovy Parallel Systems)**: GPars是Groovy的并行和并发处理库,支持数据流...

    Java中使用Groovy的三种方式

    与Java的Spring Boot框架结合使用时,Groovy可以作为Spring Boot的源代码语言,提供更加简洁的配置和更快的开发速度。Groovy的动态性使得编写Spring配置和Bean定义更加直观,而Spring Boot的"约定优于配置"理念与...

    Java调用Groovy,实时动态加载数据库groovy脚本

    在IT行业中,尤其是在软件开发领域,灵活性和动态性是至关重要的。Java作为一种广泛使用的静态类型编程语言...通过结合Java的稳定性和Groovy的动态性,我们可以构建出更适应变化的系统,提升开发效率和系统的可维护性。

    Groovy in Action源代码

    Groovy结合了Java的类型安全性和脚本语言的灵活性,使得开发者能够以更简洁、高效的代码实现复杂的任务。通过《Groovy in Action》的源代码,我们可以学习到以下知识点: 1. **基础语法**:源代码中包含了Groovy的...

    eclipse安装groovy插件的步骤

    4. **编写 Groovy 代码**:在新建的 Groovy 类文件中,可以开始编写 Groovy 代码。例如: ```groovy class Greeting { def sayHello() { println "Hello, Groovy!" } } ``` 5. **运行 Groovy 类**:右键点击...

    groovy入门经典,groovyeclipse 插件

    此外,Groovy的运算符重载和元编程能力使代码更加简洁和动态。 在安装GroovyEclipse插件后,开发者可以通过Eclipse的New -&gt; Groovy Project来创建Groovy项目。插件还会提供Groovy编译器,确保代码的正确性。同时,...

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    groovy-sdk-4.0.3

    Groovy SDK 4.0.3 是一个针对Groovy编程语言的软件开发工具包,它包含了Groovy语言的运行环境和开发所需的各种组件。...通过安装和配置这个SDK,你可以开始探索Groovy的动态世界,体验它在各种应用场景中的强大功能。

    Groovy应用(基本操作)

    Groovy的语法比Java更加简洁,它支持方法和变量的自动声明,以及类似Python的缩进风格。例如,可以使用`def`关键字定义变量,无需指定类型: ```groovy def var = "Hello, Groovy!" println var ``` 2. **...

    java在嵌入运行groovy代码1

    Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...

    groovy-2.3.6-installer

    Groovy结合了Python、Ruby和Perl等脚本语言的简洁性和灵活性,并且完全兼容Java,可以无缝地与Java代码集成。在"groovy-2.3.6-installer"这个版本中,我们聚焦于Windows操作系统上的安装过程。 Groovy 2.3.6是该...

    groovy in action 中文版 2017.11

    文档还提供了一些基本的运行和编辑Groovy代码的方法,并且提到了Groovy的IDE和编辑器支持情况,以及一些Groovy的基础知识,如类和对象的声明、使用脚本、处理文本、数字、列表、映射和范围,以及如何在Java环境中...

    Groovy入门教程[参照].pdf

    Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法简洁,减少了代码...

    groovy

    Groovy结合了Java的静态类型系统和Python、Ruby等动态语言的灵活性,使得开发者可以更加高效地编写代码。本篇文章将深入探讨Groovy语言的关键特性和应用场景。 一、Groovy简介 Groovy是2003年由James Strachan创建...

    精通 Groovy--下一代开发语言

    许多 Java 开发人员非常喜欢 Groovy 代码和 Java 代码的相似性。从学习的角度看,如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java...

    apache-groovy-sdk-4.0.1下载

    2. **bin**目录:包含了一系列可执行脚本,如`groovy`, `groovyc`, 和 `groovysh`,分别用于运行Groovy脚本、编译Groovy源代码和启动交互式Groovy shell。 3. **lib**目录:包含了Groovy运行时依赖的JAR文件,包括...

    Groovy Script 入门

    Groovy不仅支持传统的面向对象编程特性,还融合了函数式编程和元编程的特性,这使得Groovy脚本成为处理日常开发任务的强大工具。 #### 二、Groovy脚本的特点 1. **与Java的高度兼容性**:Groovy可以无缝地与Java...

    apache-groovy-sdk-3.0.6.zip

    7. **函数式编程支持**:Groovy支持闭包和高阶函数,这使得函数式编程风格在Groovy中变得非常自然,提高了代码的可读性和可维护性。 8. **动态和静态类型**:Groovy允许开发者在同一个项目中同时使用动态和静态类型...

    Groovy 动态修改XML

    博客中的作者可能还会讨论如何结合其他Groovy工具,如GPath表达式(用于更方便地查询XML)和Closure(用于定义可重用的代码块),以实现更复杂的XML处理任务。此外,可能还会提到如何在大型项目中使用Groovy来提高...

Global site tag (gtag.js) - Google Analytics