Groovy语言简介

Groovy是一门基于JVM的语言,它既支持类似Java面向对象的开发方式,也支持脚本方式编写和运行,Groovy吸收了Python、Ruby等许多语言的特性,引入了大量语法糖简化代码的编写,支持动态类型和闭包语法。此外,Groovy还具备与Java完全兼容的互操作性,同一个工程两种语言可以同时使用。由于Groovy的灵活性,Gradle配置一般使用GroovyDSL来编写,其中的build.gradle等配置其实都是Groovy脚本。这篇笔记我们简单学习了解Groovy语言。

Groovy语法简介

首先我们要知道的是,Groovy完全兼容Java语法,以下介绍的内容都是在Java的基础上进行补充。

  1. Groovy行末的分号;可以省略,依靠换行符区分。
def s = "Hello, world!"
println s
  1. 调用函数时的括号在不引起歧义的情况下,可以省略,多个参数用逗号分隔。
static def sayHello(n, s) {
    for (i in 1..n) {
        println s
    }
}

sayHello 3, "Hello, world!"
  1. Groovy是动态类型语言,推荐使用def关键字声明变量,而非使用具体的类型,变量的类型会自动推导,方法返回值也同理。
def s = "abc123"
s = true
println s
  1. 默认类、成员函数、成员变量都为public修饰(这与Java不同,Java为默认为default)。

  2. 以下三种对象属性的读取方式等价。

User u = new User();
println u.stuName
println u["stuName"]
println u.getStuName()
  1. Groovy类如果只是简单的构造赋值,一般不需要编写构造函数,可以使用如下形式写法:
class Actor {
    def actName;
    def age;
    def desc;
}

def tom = new Actor(actName: "Tom", age: 18)
  1. Groovy中字符串字面值分为单引号、双引号、三单引号、三双引号4种,单引号就是纯字符串,双引号支${}占位符变量,三单引号不支持变量但支持换行,三双引号则既支持变量也能换行。实际上,纯字符串是String类型,占位符字符串是GString类型。此外,大括号在不引起歧义的情况下也可以省略。
def msg = "Hello, world!";

def s1 = '${msg}'
def s2 = "${msg}"
def s3 = '''
Title: Hello
Content: ${msg}
'''
def s4 = """
Title: Hello
Content: $msg
"""
  1. Groovy中def默认会定义基本类型的包装类型,即def i = 1中变量iInteger类型,而非int。我们也可以直接在字面量上调用方法。
def s = 65535.toString()

类和脚本

.groovy源代码文件有类和脚本的区别,标准的类和Java使用方法相同;脚本则不同,其中代码可以不是标准的类定义,甚至可以不存在类定义。

类文件Main.groovy

class Main {
    static void main(String[] args) {
        println "Hello, world!"
    }
}

脚本文件demoscript.groovy

class Student {
    def name
    def age
}
def s = new Student(name: 'Tom', age: 18)
println s.name

包默认引入

Groovy默认引入了一些常用包,我们不需要重复写import声明。

import java.lang.*
import java.util.*
import java.io.*
import java.net.*
import groovy.lang.*
import groovy.util.*
import java.math.BigInteger
import java.math.BigDecimal

闭包

Groovy中,闭包使用大括号来定义。闭包对象可以理解为不是一个单纯的变量或某种对象实例,而是一个可执行的代码块。我们可以将闭包像变量一样传入函数或另一个闭包中来执行。

static def fetchData(onSuccess, onFailure) {
    def client = new Client()
    def result = client.getResult()
    if (result.code == 0) {
        onSuccess result.data
    } else {
        onFailure()
    }
}

def success = { msg ->
    println "Fetch data success! msg: ${msg}"
}

def failure = {
    println "fetch data failed!"
}

fetchData(success, failure)

上面代码中,successfailure为两个闭包对象。

此外,闭包反过来也支持委托函数,下面是一个例子。

def closure = {
    init()
    println "Hello, world!"
    destroy()
}

class Foo {
    def init() {
        println "System init..."
    }

    def destroy() {
        println "System exit..."
    }
}

closure.delegate = new Foo()
closure()

输出例子如下。

System init...
Hello, world!
System exit...
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap