Groovy语言学习

介绍

Groovy 是一种基于 JVM 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。

Groovy 主要的特点包括:

  • 是一个基于 Java 虚拟机的敏捷动态语言
  • 构建在强大的 Java 语言之上 并添加了从 Python、Ruby 和 Smalltalk 等语言中学到的诸多特征
  • 为 Java 开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
  • 支持 DSLDomain Specific Languages 领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。
  • Groovy 拥有处理原生类型,面向对象以及一个 Ant DSL ,使得创建 Shell Scripts 变的非常简单。
  • 在开发 Web,GUI,数据库或控制台程序时 通过减少框架性代码 大大提高了开发者的效率。
  • 支持单元测试和模拟(对象),可以简化测试
  • 无缝集成 所有已经存在的 Java 对象和类库
  • 直接编译成 Java 字节码,这样可以在任何使用 Java 的地方使用 Groovy 。

语法

语法特性

语句

  • 语句不需要分号表示结束

  • return 关键字可省略,方法的最后一句表达式可作为返回值返回

  • 导航操作符 ( ?. )可帮助实现对象引用不为空时方法才会被调用

  • 可以给参数设置默认参数

class Student {
    static void main(String[] args){
        println getMax(5);
    }   
    
    static def getMax(a,b=2){
        if(a > b){
            1;
        }else {
            0;
        }
    }
}

变量定义

如果是使用内置变量类型定义的变量,一经定义,后面是不可以更改变量类型的。但是Groovy也提供了类似javascript中的any定义任意变量类型的关键字def。而且不需要强制指定类型

task testGroovy() {
    def i = 1           //不需要指定类型
    println(i)
}

定义类

Groovy兼容Java,定义类就和Java一样了,类中成员变量会隐式生成get/set方法,最后观察打印方法的调用,在Groovy中方法调用可以省略"()"

默认类和方法是public,字段是private

task testGroovy() {
    // 类中字段赋值
    Project p = new Project("groovy", "1.0.0", "jvm")
    // 打印版本号
    println p.version
}

class Project {
    //自动生成get/set
    String name
    String version
    String group

    Project(String name, String version, String group) {
        this.name = name
        this.version = version
        this.group = group
    }
}

字符串

Groovy有三种定义字符串的方式:

task testGroovy2() {
    def s = 'hello'             //单引号
    println s
}
task testGroovy2() {
    def s1 = 'hello'

    def s2 = "$s1 groovy"    //双引号,支持变量。和kotlin一样,可以使用 $ 符号取变量值
    println s2
}
task testGroovy3() {
    // 三个单引号,可以换行
    def s = '''hello 
    groovy
    is
    simple
    '''
    println s
}

集合

定义list时使用 [] ,使用 <<添加一个元素

task testGroovy4() {
    def list = ['one', 'two', 'three']            //定义 list
    list << 'four'								//添加元素。
    println list[3]
}

map使用 : 隔开,区别keyvalue,也支持 <<添加一个元素

task testGroovy5() {
    def map = ['one': 1, 'two': 2, 'three': 3]
    map << ['four': 4]
    println map['four']
    println map.four
}

range

def list1 = 1..10   //从 1 到 10 
def list2 = 1..<10  //从 1  到 9
def list3 = 'a'..'x'  // 从 a 到 x
def list4 = 10..1    // 从10 到 1 
def list5 = 'x'..'a'

闭包

闭包是一个短的匿名代码块。每个闭包会被编译成继承 groovy.lang.Closure 类的子类,这个类有一个叫 call 方法,通过该方法可以传递参数并调用这个闭包。lambda表达式表示的变量,也就是函数类型变量

task testGroovy6() {
    def print1 = { message ->                   // lambda
        println "$message end"
    }
    
    print1 "hello"
}

循环

// 第一种循环:each
	def list = [1,2,3,4,5]
	list.each {
	      println it
	}

// 第二种循环:in
    for  ( i  in  0..2 ) {
        println("hello Groovy")
     }
     
// 第三种循环
   3.times {
        println("hello Groovy")
    }

// 第四种循环
   0.upto(2) {
        println("hello Groovy")
    }

// 除此之外,java的while也支持

正则

def reg1 =~ 'he*llo'
def reg2 = /he*llo/
println "类型是: ${reg1.class}"          // 类型是: java.util.regex.Pattern
println "类型是: ${reg2.class}"          // 类型是: java.lang.String
println "hello".matches(reg1)            // true
println "hello".matches(reg2)            // true

  • =~ 可以得到 java.util.regex.Matcher
  • ==~ 可以得到布尔类型
def val1 = "hello" =~ "he*llo"            //左边是变量,右边是正则
println val1.class                        // java.util.regex.Matcher
print val1.matches()                      // true

def val2 = "hello" ==~ "he*llo"
print val2                                // true

Traits 特征

Scala 等语言更有详细描述。

with语法(闭包实现)

Groovy 中的这个 with 方法跟 Kotlin 中的 apply 方法类似,它使用了闭包:

class Name {
    String firstName;
    String secondName

    static void main(String[] args) {
        def name = new Name()
        name.with {
            firstName = "XXXX"
            secondName = "YYYYY"
            println "$firstName $secondName"
        }
    }
}

with 方法中的这个闭包,可以直接使用 firstName 这个成员变量,也可以使用内部中的 public 方法。

委托

上述 with 方法之所以能够调用对象中的成员变量和方法,是因为它改变了委托策略。

闭包中的委托有三个重要的概念,它们分别是 this \ owner \ delegate。它们的区别是:

  • this:闭包定义处 外部的类 或者 这个类 对象。
  • owner:闭包定义处 外部的类或者类对象 或者外层的闭包对象
  • delegate:可以是任何对象,默认 owner

命令链功能

Groovy 可以省略顶级语句方法调用中参数外面的括号命令链功能则将这种特性继续扩展,它可以将不需要括号的方法调用串接成链,既不需要参数周围的括号,链接的调用之间也不需要点号

//没有参数的必须加括号
//每个方法都必须返回 this,类似于builder模式。
methodA a,b  methodB c  methodC()  methodD d,e,f 

数据类型

  • byte -这是用来表示字节值。例如2。
  • short -这是用来表示一个短整型。例如10。
  • int -这是用来表示整数。例如1234。
  • long -这是用来表示一个长整型。例如10000090。
  • float -这是用来表示32位浮点数。例如12.34。
  • double -这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565。
  • char -这定义了单个字符文字。例如“A”。
  • Boolean -这表示一个布尔值,可以是true或false。
  • String -这些是以字符串的形式表示的文本。例如,“Hello World”。

数值类型的数值范围与Java一致。

运算符

算术运算符:+-*/%++--

关系运算符:==!=>>=<<=

逻辑运算符:&& || !

位运算符:& | ^ ~

赋值运算符: += -= *= /= %=

范围运算符:..

三元预算法:?:def result = a != null ? a : "name" 简化成 def resultA = a ?: "name"

Groovy 中的 == 操作符等价于使用 equals 方法,该方法可以复写,地址比较用 is 方法

一切皆可转化为Boolean

任何为 nullVoid的对象,或者等同于 0 或者为 null 的值,都会被解析为 false,反之则为 true

所以一般对 String 判断可以从 str != null && str.length() > 0 可以改为 !str

参考

API文档

下载地址

在线编程

常用类

Json

groovy.json.JsonOutput

你可能感兴趣的:(其他语言,groovy)