Groovy脚本的认识和语法

转:(https://www.jianshu.com/p/e8dec95c4326

简介:

Groovy是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)。并且,Groovy 可以与 Java 语言无缝对接,在写 Groovy 的时候如果忘记了语法可以直接按Java的语法继续写,也可以在 Java 中调用 Groovy 脚本,都可以很好的工作,这有效的降低了 Java 开发者学习 Groovy 的成本。Groovy 也并不会替代 Java,而是相辅相成、互补的关系,具体使用哪门语言这取决于要解决的问题和使用的场景。

数据类型绑定:

在 Groovy 中,调用的方法将在运行时被选择。这种机制被称为运行时分派或多重方法(multi-methods),是根据运行时实参(argument)的类型来选择方法。Java 采用的是相反的策略:编译时根据声明的类型来选择方法。

下面是一个例子,同样的 Java 代码在 Java 和 Groovy 环境中运行结果是不同的.

int method(String arg) {
    return 1;
}
int method(Object arg) {
    return 2;
}
Object o = "Object";
int result = method(o);
// In Java
assertEquals(2, result);
// In Groovy
assertEquals(1, result);

产生差异的原因在于,Java 使用静态数据类型,o 被声明为 Object 对象,而 Groovy 会在运行时实际调用方法时进行选择。因为调用的是 String 类型的对象,所以自然调用 String 版本的方法。

基本语法:

Groovy 定义变量的方式和 Java 是类似的,区别在于 Groovy 提供了def关键字供使用,它可以省略变量类型的定义,根据变量的值进行类型推导。

def a = 123
def b = 'b'
def c = true 
boolean d = false
int e = 123

如果定义变量的字面量值为数字时,类型会根据数字的大小自动调整

def a = 1
assert a instanceof Integer

// Integer.MAX_VALUE
def b = 2147483647
assert b instanceof Integer

// Integer.MAX_VALUE + 1
def c = 2147483648
assert c instanceof Long

// Long.MAX_VALUE
def d = 9223372036854775807
assert d instanceof Long

// Long.MAX_VALUE + 1
def e = 9223372036854775808
assert e instanceof BigInteger

对于浮点型字面量为了精度 Groovy 默认使用的类型为 BigDecimal

def decimal = 123.456
println decimal.getClass() // class java.math.BigDecimal

Groovy为 数字类型提供一种更简单的声明类型的方式:类型后缀

- Integer 使用I或i
- Long 使用L或l
- BigInteger 使用G或g
- BigDecimal 使用G或g
- Double 使用D或d
- Float 使用F或f

使用例子

def a = 123I
assert a instanceof Integer
def b= 123L
assert b instanceof Long

字符串

在Groovy种有两种字符串类型,普通字符串(java.lang.String)和插值字符串(groovy.lang.GString)。
普通字符串使用单引号

println 'hello'

插值字符串使用双引号

def name = '张三'
println "hello $name"

除此之外,还支持三单引号的写法,可以保留文本的换行及缩进格式

def strippedFirstNewline = '''line one
        line two
            line three
'''
println strippedFirstNewline
// 可以写成下面这种形式,可读性更好
def strippedFirstNewline2 = '''\
line one
    line two
line three
'''
println strippedFirstNewline2

字符

在 Groovy 中并没有明确的字符字面量表示形式,需要显示的指定,有三种方式

char c1 = 'A' // 声明类型
assert c1 instanceof Character

def c2 = 'B' as char // 用as关键字
assert c2 instanceof Character

def c3 = (char) 'C' // 强制类型转换
assert c3 instanceof Character

方法(函数)

Groovy 方法的默认访问修饰符是public,方法的返回类型可以不需要声明,但需添加def关键字。有返回值的方法return可以被省略,默认返回最后一行代码的运行结果,如果使用了return关键字则返回指定的返回值。

String method1() {
    return 'hello'
}
assert method1() == 'hello';

def method2() {
    return 'hello'
}
assert method2() == 'hello';

def method3() {
    'hello'
}
assert method3() == 'hello';

Groovy 方法的参数类型可以被省略,默认为Object类型。

def add(int a, int b) {
    return a + b
}
//与上面的等价
def add(a, b) {
    a + b
}

Groovy 方法的其他特性与Java一样,比如支持重载、不定长参数(...)等。

Lists

Groovy 定义 List 的方式非常简洁,使用中括号([]),以逗号(,)分隔元素即可。Groovy中的 List 其实就是java.util.List,实现类默认使用的是java.util.ArrayList

def numbers = [1, 2, 3]         

assert numbers instanceof List  
assert numbers.class == java.util.ArrayList  
assert numbers.size() == 3 

Arrays

Groovy 定义数组的语法和 List 非常类似,区别在于数组的定义必须指定类型为数组类型,可以直接定义类型或者使用def定义然后通过as关键字来指定其类型。

String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] //直接声明类型为数组类型  String[]

assert arrStr instanceof String[]    
assert !(arrStr instanceof List)

def numArr = [1, 2, 3] as int[]     //痛过as关键字指定类型为数组类型 int[] 

assert numArr instanceof int[]       
assert numArr.size() == 3

Maps

Groovy 定义 Map 的方式非常简洁,通过中括号包含key、val的形式,key和value以冒号分隔([key:value])。Groovy中的Map其实就是java.util.Map,实现类默认使用的是java.util.LinkedHashMap

// key虽然没有加引号,不过Groovy会默认将其转换为字符串
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']

assert colors['red'] == '#FF0000' // 使用中括号访问
assert colors.green == '#00FF00' // 使用点表达式访问

colors['pink'] = '#FF00FF' // 使用中括号添加元素,相当于Java Map 的 put(key,value)方法
colors.yellow = '#FFFF00'// 使用点表达式添加元素
assert colors.pink == '#FF00FF'
assert colors['yellow'] == '#FFFF00'
assert colors instanceof java.util.LinkedHashMap // 默认使用LinkedHashMap类型

// Groovy Map的key默认语法不支持变量,这里的key时间上是字符串'keyVal'而不是keyVal变量的值'name'
def keyVal = 'name'
def persons = [keyVal: 'Guillaume'] 
assert !persons.containsKey('name')
assert persons.containsKey('keyVal')

//要使用变量作为key,需要使用括号
def keyVal = 'name'
def persons = [(keyVal): 'Guillaume'] 
assert persons.containsKey('name')
assert !persons.containsKey('keyVal')

 

### Groovy 脚本 API 及语法简介 Groovy 是一种基于 Java 平台的动态语言,它不仅兼容 Java 的语法结构,还提供了更简洁、灵活的功能扩展。以下是关于 Groovy 脚本的核心 API 基础语法的内容。 #### 一、核心 API 功能概述 Groovy 提供了一组丰富的 API 来支持脚本编写运行环境管理。其中 `GroovyScriptEngine` 是用于加载执行 Groovy 脚本的关键组件之一[^1]。通过它可以实现动态加载外部脚本并调用其功能。 当 Groovy 文件被编译成字节码时,实际上会生成一个继承自 `groovy.lang.Script` 类的 Java 类[^2]。这意味着每个 Groovy 脚本都可以看作是一个标准的 Java 应用程序,并且可以通过静态入口点 (`static void main`) 执行。 为了更好地理解这些机制,在实际开发过程中通常需要引入官方提供的依赖库来完成必要的操作: ```xml <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.1.9</version> </dependency> ``` 上述 Maven 配置片段展示了如何添加 Groovy 支持到项目中的方式[^3]。 --- #### 二、基本语法规则说明 ##### 1. **变量声明** 在 Groovy 中,默认情况下不需要显式指定数据类型的名称即可创建新变量。例如: ```groovy def name = "John Doe" int age = 30 boolean isStudent = false ``` 这里需要注意的是关键字 `def` 表明当前对象类型由系统自动推断得出。 ##### 2. **控制流结构** 类似于其他高级编程语言,Groovy 同样具备条件判断以及循环处理能力。下面给出一段简单的例子演示 if-else 结构的应用场景: ```groovy if (age >= 18){ println 'Adult' } else { println 'Minor' } ``` 对于迭代过程而言,则可采用如下形式表达集合遍历逻辑: ```groovy [1, 2, 3].each { item -> println(item * 2) } ``` ##### 3. **闭包概念介绍** 闭包是 Groovy 特有的重要特性之一,允许开发者封装一块代码作为参数传递给函数或者存储起来稍后再用。它的典型应用体现在简化回调接口设计方面。 ```groovy def closureExample = { String greeting -> "${greeting}, World!" } println(closureExample('Hello')) // 输出 Hello, World! ``` 以上实例定义了一个接受字符串输入并将之拼接到固定模板上的匿名方法体——即所谓的“闭包”。 ##### 4. **异常捕获与抛出** 错误管理调试也是构建健壮应用程序不可或缺的一部分。因此掌握好 try-catch-finally 块式的运用显得尤为重要。 ```groovy try{ int result = 1 / 0 }catch(Exception e){ println(e.message) }finally{ println("This will always execute.") } ``` --- #### 三、总结 综上所述,Groovy 不仅保留了传统 JVM 生态圈内的优势特点,同时还融入了许多现代化改进措施使得整体更加易学实用。无论是快速原型搭建还是日常维护工作都能发挥巨大作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值