Java好搭档Groovy核心语法总结

举报
jackwangcumt 发表于 2021/07/28 20:05:25 2021/07/28
【摘要】 Groovy是一种基于JVM,功能强大、类型可选,动态的、可与Java无缝衔接的编程语言。Groovy语法简洁、易于学习,可以大大提高开发人员的工作效率,可为Java程序添加强大的功能,包括脚本功能、特定领域的语言编写、运行时和编译时元编程以及函数式编程。本文将快速介绍核心语法,让读者快速入门。

      Java当前是企业级开发中非常重要的一种语言,它是强类型的语言,在编写代码时,会严格对类型进行检测,这样大大提高了程序的稳定性,同时也降低了Bug发生的概率。但是,有的时候,我们希望Java能不能具有类似JavaScritpt相关的特点,如不对类型进行严格检测,且具有动态脚本的特点,可以作为一种脚本引擎来实现灵活的逻辑处理。

1 Groovy是什么

      哪里有需求,哪里就有市场。基于这种朴素的想法,开源社区也给我们开发者提供了一种非常好的脚本语言Groovy,根据官方介绍,Groovy是一种基于JVM,功能强大、类型可选(默认是弱类型的,也可以通过注解开启类型检测)、动态的,可与Java无缝衔接的编程语言。Groovy语法简洁、易于学习,可以大大提高开发人员的工作效率,可为Java程序添加强大的功能,包括脚本功能(scripting capabilities)、特定领域的语言编写(Domain-Specific Language)、运行时和编译时元编程( meta-programming )以及函数式编程(functional programming)。
      官网为 http://www.groovy-lang.org , 官网页面截图如下:

1.jpg

    注意:当前Groovy最新版本为4.0,不过是alpha版本,还不太稳定。商业使用建议采用 Groovy 3.0.8 

2 Groovy核心语法

      Goovy语言构建在强大的JVM之上,在设计时,综合考虑了其他编程语言的优势特征,如添加了Python和Ruby等语言的特征,即动态类型转换、闭包和元编程支持。这为Java开发者提供了最流行的编程语言特性。如果将Java语言比作老虎,那么Groovy就是翅膀,二者配合起来,就是如虎添翼。下面给出该语言的核心语法:

////////////////////////////////////////////////////////////////////////
//定义变量
def x = 2
//打印
println x
/*
不同类型也可以赋值
*/
x = "hello"
println x
msg = "world"
println "hello " + msg //hello world
println 3 / 2    // 1.5
println 3 // 2   // 3
println 3 % 2    // 1
println 3 * 2  // 6 
println 3 + 2  // 5
println 3 ** 2  // 9 
println  3 == 3  //true
String str = "Hello"
str = 2.3 
////////////////////////////////////////////////////////////////////////
//列表
def list = []
a = list.add("Java");
println a //true
println list //[Java]
list << "F#"
println list //[Java, F#]
println list.remove("F#") //true
println list //[Java]
println list - "Java"  // []
list.addAll(["java","C#"])
list.each { println "$it"}
/*
Java
java
C#
*/
list.eachWithIndex { it, i -> println "$i: $it"}
/*
0: Java
1: java
2: C#
*/
ele = list.contains( 'java' )
println ele //true
println 'java' in list  //true
Collections.replaceAll(list,"java","Groovy")
println list //[Java, Groovy, C#]
////////////////////////////////////////////////////////////////////////
//定义map类型
def myMap = [:]
myMap.put("XH",'123')
myMap.put("Name",'Jack')
myMap.each { println "$it.key: $it.value" }
myMap.eachWithIndex { it, i -> println "$i: $it"}
/*
XH: 123
Name: Jack
0: XH=123
1: Name=Jack
*/
println myMap.containsKey('Name') //true
println myMap.containsValue('jack') // false 区分大小写
println myMap.keySet() //[XH, Name]
println myMap.values() //[123, Jack]
//for迭代map
x = ""
for ( e in myMap ) {
    x += e.value
    x += " "
}
println x
////////////////////////////////////////////////////////////////////////
//函数定义
def sayMsg(msg="Groovy"){
   "Hello,$msg"
}
println sayMsg() //Hello,Groovy
println sayMsg('Java') //Hello,Java
////////////////////////////////////////////////////////////////////////
//if分支
def func_if(x = 0){
     if(x< 0) {
        println "<0"
    } else if(x<20) {
        println "[0,20)"
    } else {
        println ">20"
    }
}
println func_if(20) //null
//for循环
def func_for(){
    def x = 0
    for (i in 0 .. 10) {
        x += i
    }
     println x //55
     x = 0
     for( i in [1,2,3,4,5,6,7,8,9,10] ) {
            x += i
     }
     println x // 55
}
func_for()
////////////////////////////////////////////////////////////////////////
//Expando动态Bean类型,支持添加属性和方法
def user = new Expando(name:"Jack")
println user //{name=Jack}
user.xh = "123"
println user //{name=Jack, xh=123}
user.info = { 
    println "Name: $name,XH:$xh"
}
user.info() //Name: Jack,XH:123
////////////////////////////////////////////////////////////////////////
//扩展方法 和 Metaprogramming
String.metaClass.xxxFunc = {
   println "xxxFunc"
}
"str"?.xxxFunc() //xxxFunc
////////////////////////////////////////////////////////////////////////
class TestGroovyInterceptable implements GroovyInterceptable {
    def sum(Integer a, Integer b) { a + b }

    def invokeMethod(String name, args) {
        println "Invoke method: $name,args: $args"
    }
}
def test = new TestGroovyInterceptable()
//Invoke method: sum ,args: [2, 3]
test?.sum(2,3) 
//Invoke method: power,args: [2, 3]
test?.power(2,3)
////////////////////////////////////////////////////////////////////////
import groovy.transform.TypeChecked
//类型检测
@TypeChecked
Integer testTypeCheck() {
    //[Static type checking] - 
    //Cannot assign value of type java.lang.String to variable of type java.lang.Integer
    Integer num = "1"
    return num
}
////////////////////////////////////////////////////////////////////////
import groovy.transform.CompileStatic
//静态方法
@CompileStatic
int sum(int x, int y) {
    x + y
}
sum(2,7) //9
////////////////////////////////////////////////////////////////////////
//类
class Student {
    //只读
    final String name = "Jack"
    Integer age = 0
    protected void setAge(Integer age) { 
       this.age = age 
    }
    def info(){
      "$name,$age,$tag"
    }
    //动态类型
    def tag
}
def stu = new Student()
stu.setAge(33)
stu.tag = [1,2,3] 
println stu.info() //Jack,33,[1, 2, 3]
////////////////////////////////////////////////////////////////////////
//JSON处理
import groovy.json.JsonOutput
def strJSON = JsonOutput.toJson([stu])
println(strJSON) //[{"age":33,"tag":[1,2,3],"name":"Jack"}]
////////////////////////////////////////////////////////////////////////
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "name": "Jack", "xh" : "123"}')
println(object.name)
println(object.xh)
////////////////////////////////////////////////////////////////////////
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
Object lst = jsonSlurper.parseText('[2, 3, 4, 5]')
lst.each { println it }

     从上述示例中可知,Groovy语言可Python语言有点类似,声明变量默认是不检测类型的,即初始值是一个字符串,后面也可以根据需要修改为数值类型。同时,其动态型,可以很好的处理不确定的场景,比如动态处理数据,由于不同的实体或表的结构都是不同的,那么可以用一个方法来处理所有的实体对象,这个对象的构造可以通过动态属性或方法来完成,这样更加的灵活。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。