groovy

Groovy是一种运行在JVM上的动态语言,拥有Python和Ruby的特性。它与Java高度兼容,可直接集成到Java项目中。本文介绍Groovy的基础安装、使用方法及语法特点。

title: Groovy 语言简介

Groovy 是什么

groovy 是运行在 JVM 中、具有象 Python,Ruby 语言特性的灵活动态语言,groovy 代码被编译成 java 字节码,然后能集成到 java 应用程序中或者 web 应用程序。groovy 与 java 平台非常融合,groovy 的许多代码是使用 java 实现的,其余部分是用groovy 实现的,Groovy 仅仅是创建 java 类的一种新的途径。

Groovy Eclipse插件安装

详见:http://wujq4java.iteye.com/blog/1947658
groovy被称为java的替代语言,通过上图可以看出,java和groovy都是建立在JVM基础上的语言,即groovy和java一样都可以编译成JVM可读的.class文件。而且groovy完全兼容java语言,即所有java代码放到groovy代码中都是可运行的。

Groovy 使用

只需在原有的java项目中添加如下dependency依赖:
<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.3.6</version>
</dependency>
只需简单的引用一个groovy-all.jar包就可以了,是不是很方便。如果你已经安装好了groovy 的eclipse插件,那么你就可以在你的java工程中通过右键:New -> Other -> Groovy -> Groovy Class来创建一个groovy类(比如类 GroovyTest),大概是这样:
class GroovyTest {
    public GroovyTest() {
    }

    static main(args) {
    }
}
你会发现这个新创建的groovy类看上去和java类几乎没有什么区别(除了缺少public 和 void 关键字以外,当然类文件变成了GroovyTest.groovy)。

Groovy 脚步特性

groovy能够在运行时对源文件进行解释(编译),从而具有了脚步语言的特性。这样的话同样是修改源代码,如果修改java源文件需要重新编译打包和发布工程,但是修改groovy源文件后你什么都不需要做,jvm会在第一次执行修改后的groovy源文件时把它编译成.class文件。正是这个特性,使我们在nemo-oil和nemo-mobile工程中使用groovy来管理各种业务上的返利规则(易变动),nemo-oil工程的nemo.oil.biz.OilRuleMasterBiz类示范了如何在java代码中调用groovy代码。

Groovy 完整代码示例

/**
 * 中石油返利规则委托实现
 * @author Medeson.Zh
 */
class O_CUC_COMMON{
    def PLATINUM = "1" //白金卡
    def DIAMOND = "2" //钻石卡
    def TALLEST = 75000
    def rate = 0  //返利比例,需要委托类定义

    /**
     * 加油卡充值返利;
     * @param amount 加油金额
     * @param cardtype 卡类型
     * @return 返利金额
     */
    public int recharge(int amount,String cardtype){
        int value
        if (PLATINUM==cardtype)
            value = amount * 0.02
        else if (DIAMOND==cardtype)
            value = amount * 0.025
        else
            value = 0
        return value
    }

    /**
     * 套餐返利上限
     * @return Map
     */
    public Object active(){
        int bonuse = TALLEST*rate
        return ["base":TALLEST,"amount":bonuse]
    }

    /**
     * 消费返利
     * @param amount
     * @return
     */
    public Object consume(int amount,String cardType){
        int cons_1=0,cons_2=0
        if (amount>TALLEST){
            cons_1 = TALLEST*rate
            cons_2 = recharge(amount-TALLEST,cardType)
        }
        else
            cons_1 = amount*rate

        return ["inner":cons_1,"outer":cons_2]
    }
}

Groovy 语法特性

1 没有类型的 java,groovy在运行时自动识别类型
def var= "hello world"
println var.class

程序输出:
java.lang.String

2 不需要的 public,groovy 中默认的修饰符就是 public,所以 public 修饰符你根本就不需要写
def repeat(val){
    for (i = 0 ; i < 5 ; i++){
        println val
    }
}
3 不需要的语句结束符,Groovy 中没有语句结束符,即每条语句后不需要加“;”号,但是如果一行上有多条语句,则需要使用“;”号。
def var = "hello world"
def var2 = "dog"; def var3 = "cat"; def var4 = "bird"
4 一切皆对象,听起来象是“众生平等”的味道,事实上 groovy 对于对象是什么类型并不关心,一个变量的类型在运行中随时可以改变,一切根据需要而定。如果你赋给它 boolean ,那么不管它原来是什么类型,它接受 boolean 值之后就会自动把类型转变为 boolean 值。看下面的代码:
def var = "hello world,groovy!"
println var
println var.class
var = 1001
println var.class

程序输出:
hello world,groovy!
class java.lang.String
class java.lang.Integer

5 除了标准的 java.lang.String 以外(用 ’ 号括住), groovy 还支持 Gstring 字符串类型(用 “ 号括住),GString可以使用 $(变量名) 的形式获取变量的值,看下面的代码:
def var = "hello world,groovy!"
def repeat(val){
    for (i = 0; i < 5; i++){
        println "This is ${i}:${val}"
    }
}
repeat(var)

程序输出:
This is 0:hello world,groovy!
This is 1:hello world,groovy!
This is 2:hello world,groovy!
This is 3:hello world,groovy!
This is 4:hello world,groovy!

6 循环,可以使用for (i in 0 .. 5 ) 这样的用法,其中的 0 .. 5 是一个范围,范围是一系列的值。例如 “0..5” 表明包含整数 0、1、2、3、4、5。
def var = "hello world,groovy!"
def repeat(val){
    for (i in 0 .. 5){
        println val
    }
}
repeat(var)

程序输出:
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!

7 Groovy 支持最常见的两个 java 集合:java.util.Collection 和 java.util.Map。
//Groovy 中这样来定义一个 Collection:
def collect = ["a", "b", "c"]
//除了声明时往集合中添加元素外,还可以用以下方式向集合中添加元素:
collect.add(1)
collect << "come on"
collect[5] = 100 
//Collection 使用类似数组下标的方式进行检索:
println collect[collect.size() - 1]
println collect[5]
//groovy 支持负索引:
println collect[-1]      // 索引其倒数第 1 个元素
println collect[-2]      // 索引其倒数第 2 个元素
//如此可以定义一个 Map:
def map = ['name':'john', 'age':14 , 'sex':'boy']
//添加项:
map = map + ['weight':25]       // 添加 john 的体重
map.put('length', 175)      // 添加 john 的身高
map.father = 'Keller'          // 添加 john 的父亲
//可以用两种方式检索值:
println map['father']       // 通过 key 作为下标索引
println map.length          // 通过 key 作为成员名索引
8 闭包是用 { 符号括起来的代码块,它可以被单独运行或调用,也可以被命名。类似‘匿名类’或内联函数的概念。闭包中最常见的应用是对集合进行迭代,下面定义了 3 个闭包对 map 进行了迭代:
map.each ({key,value->    //key,value 两个参数用于接受每个元素的键-值对
    println "$key:$value"})
map.each {println it}     //it 是一个关键字,代表 map 集合的每个元素
map.each ({println it.getKey() + "-->" + it.getValue()})
//除了用于迭代之外,闭包也可以单独定义:
def say = {word->
    println "Hi,$word!"
}
//调用:
say('groovy')
say.call('groovy&grails')

程序输出:
Hi,groovy!
Hi,groovy&grails!

Groovy 优势

Groovy 的优势除了其所具有的运行期解释的特性外,还有它抛弃了 java 烦琐的文法,同时增加一些简洁的语法(如闭包)。同样的语句,使用 groovy 能在最大限度上减少你的击键次数——这确实是“懒惰程序员们”的福音,例如如果需要写一个程序列出一个文件中每一行的数据,在每一行前面输出行号,groovy只需下面几行代码而已:
def number = 0
new File ('test.groovy').eachLine {line ->
    number++
    println "$number: $line"
}

Groovy 进阶

精通groovy(博客)- http://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html

groovy in action 中文版(书籍)- http://vdisk.weibo.com/s/CPOlB

<think>我们正在回答用户关于Groovy编程语言的基础、使用场景和最新版本的问题。根据引用内容,Groovy是一种基于Java平台的动态语言,与Java高度兼容,具有简洁的语法和强大的功能(引用[3]和[4])。同时,它既可以用于面向对象编程,也可以用作脚本语言(引用[2])。 ### Groovy编程语言基础 Groovy的基础包括以下关键特性: 1. **动态类型**:Groovy支持动态类型,变量可以使用`def`关键字声明,无需指定类型。 2. **简洁语法**:相比Java,Groovy语法更简洁。例如,分号可选,方法调用括号可选,属性自动生成getter/setter。 3. **闭包**:Groovy支持闭包(引用[5]),这是一种匿名函数,可以赋值给变量或作为参数传递。闭包使得集合操作非常方便。 4. **与Java互操作**:Groovy可以无缝使用Java类库,编译成Java字节码(引用[4])。 5. **字符串处理**:支持多种字符串(GString),支持字符串插值。 6. **集合操作**:提供丰富的集合操作API,如`each`, `collect`, `findAll`等(引用[5]示例)。 ### 使用场景 Groovy的常见使用场景包括: 1. **脚本编写**:由于语法简洁,Groovy适合编写系统管理脚本、构建脚本(如Gradle构建工具)。 2. **测试**:广泛用于单元测试和集成测试(如Spock测试框架)。 3. **Web开发**:可以用于Grails框架(基于Spring Boot)快速开发Web应用。 4. **领域特定语言(DSL)**:Groovy的语法灵活性使其成为创建内部DSL的理想选择。 5. **数据库编程**:Groovy的SQL模块(如`groovy.sql.Sql`)简化了数据库操作(引用[3])。 ### 最新版本 截至2023年,Groovy的最新稳定版本是**4.0.13**(发布于2023年12月)和**3.0.19**(长期支持版本)。Groovy 4.0引入了新特性: - **Switch表达式**:增强的switch表达式(类似Java 14+的switch表达式)。 - **Sealed类型**:支持密封类(sealed classes)和接口(sealed interfaces)。 - **记录类(Record)**:支持记录类(类似Java 16的record)。 - **GDK增强**:Groovy开发工具包(GDK)增加了更多便捷方法。 ### 示例代码 以下是一个简单的Groovy脚本示例,展示闭包和集合操作: ```groovy // 定义一个列表 def numbers = [1, 2, 3, 4, 5] // 使用闭包将每个元素加倍 def doubledNumbers = numbers.collect { it * 2 } println doubledNumbers // 输出: [2, 4, 6, 8, 10] ``` ### 总结 Groovy是一种功能强大且灵活的JVM语言,特别适合脚本编写、测试和快速开发。其与Java的互操作性使得Java开发者可以轻松上手。最新版本持续改进并引入现代语言特性[^3][^4][^5]。 ### 相关问题 1. Groovy闭包与Java Lambda表达式有何异同? 2. 如何在Groovy中调用Java库? 3. Groovy在微服务架构中的应用场景有哪些? 4. Groovy 4.0的新特性如何提升开发效率?</think>### Groovy 编程语言基础 Groovy 是一种基于 Java 平台(JVM)的动态语言,结合了脚本语言的灵活性和面向对象编程的强大功能。核心特性包括: 1. **与 Java 无缝集成** - 可直接调用 Java 类库,编译为 Java 字节码 - 兼容 Java 语法,Java 开发者可快速上手 - 示例:`new java.util.Date()` 直接创建 Java 对象[^4] 2. **动态类型与静态类型支持** - 支持 `def` 动态类型:`def name = "Groovy"` - 也可显式声明类型:`String version = "4.0"` 3. **简洁语法增强** - 可选分号与括号:`println "Hello World"` - 字符串插值:`def msg = "Version: ${version}"` - 安全导航操作符:`user?.address?.city`(避免 NullPointerException) 4. **闭包与集合操作** ```groovy def numbers = [1, 2, 3, 4] def squares = numbers.collect { it * it } // [1, 4, 9, 16][^5] ``` 5. **元编程能力** 支持运行时修改类和方法(如 `methodMissing` 特性) --- ### 主要使用场景 1. **脚本自动化** - 系统管理脚本(替代 Shell/Python) - 文件处理、批量任务等场景 ```groovy new File("data.txt").eachLine { println it.toUpperCase() } ``` 2. **构建工具(Gradle)** Gradle 构建脚本采用 Groovy DSL,语法简洁: ```groovy plugins { id 'java' } dependencies { implementation 'org.apache.commons:commons-lang3:3.12.0' } ``` 3. **测试框架(Spock)** 行为驱动测试的天然选择: ```groovy def "sum should return correct result"() { expect: Math.sum(2, 3) == 5 } ``` 4. **Web 开发(Grails 框架)** 全栈框架提供快速开发能力: ```groovy class BookController { def index() { [books: Book.list()] } } ``` 5. **数据库编程** 通过 `groovy.sql.Sql` 简化数据库操作(如上一问题中的示例)[^3] --- ### 最新版本与生态 - **当前稳定版**:**Groovy 4.0.15**(2023年发布) - **关键更新**: - **Switch 表达式**(类似 Java 17) ```groovy def result = switch(num) { case 1 -> "One" case 2 -> "Two" default -> "Unknown" } ``` - **Sealed 类支持**:限制类继承关系 - **Record 类**:简化不可变数据模型 - **GDK 增强**:扩展标准库的便捷方法 - **版本控制**:通过 SDKMAN! 管理多版本(`sdk install groovy 4.0.15`)[^1] --- ### 典型优势 | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **开发效率** | 代码量比 Java 减少 30%-50%[^4] | | **学习曲线** | Java 开发者可 1 天内掌握基础 | | **性能** | 静态编译(`@CompileStatic`)下接近 Java 性能 | | **扩展性** | 轻松集成 Spring Boot 等 Java 生态框架 | > 示例:Groovy 与 Java 代码量对比 > **Java 文件读取**: > ```java > BufferedReader br = new BufferedReader(new FileReader("file.txt")); > String line; while ((line = br.readLine()) != null) System.out.println(line); > br.close(); > ``` > **Groovy 等效实现**: > ```groovy > new File("file.txt").eachLine { println it } > ``` --- ### 相关问题 1. Groovy 闭包与 Java Lambda 表达式有何异同? 2. 如何在 Spring Boot 项目中集成 Groovy 脚本? 3. Groovy 的 `@CompileStatic` 注解如何提升性能? 4. Groovy 在数据科学领域有哪些应用场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值