Java当前是企业级开发中非常重要的一种语言,它是强类型的语言,在编写代码时,会严格对类型进行检测,这样大大提高了程序的稳定性,同时也降低了Bug发生的概率。但是,有的时候,我们希望Java能不能具有类似JavaScritpt相关的特点,如不对类型进行严格检测,且具有动态脚本的特点,可以作为一种脚本引擎来实现灵活的逻辑处理。
1 Groovy是什么
哪里有需求,哪里就有市场。基于这种朴素的想法,开源社区也给我们开发者提供了一种非常好的脚本语言Groovy,根据官方介绍,Groovy是一种基于JVM,功能强大、类型可选(默认是弱类型的,也可以通过注解开启类型检测)、动态的,可与Java无缝衔接的编程语言。Groovy语法简洁、易于学习,可以大大提高开发人员的工作效率,可为Java程序添加强大的功能,包括脚本功能(scripting capabilities)、特定领域的语言编写(Domain-Specific Language)、运行时和编译时元编程( meta-programming )以及函数式编程(functionalprogramming)。
官网为 http://www.groovy-lang.org , 官网页面截图如下:
注意:当前Groovy最新版本为4.0,不过是alpha版本,还不太稳定。商业使用建议采用 Groovy 3.0.8 。
2 Groovy核心语法
Goovy语言构建在强大的JVM之上,在设计时,综合考虑了其他编程语言的优势特征,如添加了Python和Ruby等语言的特征,即动态类型转换、闭包和元编程支持。这为Java开发者提供了最流行的编程语言特性。如果将Java语言比作老虎,那么Groovy就是翅膀,二者配合起来,就是如虎添翼。下面给出该语言的核心语法:
//////////////////////////////////////////////////////////////////////////定义变量defx=2//打印printlnx/*不同类型也可以赋值*/x="hello"printlnxmsg="world"println"hello "+msg//hello worldprintln3/2// 1.5println3// 2 // 3println3%2// 1println3*2// 6 println3+2// 5println3**2// 9 println3==3//trueStringstr="Hello"str=2.3//////////////////////////////////////////////////////////////////////////列表deflist= [] a=list.add("Java"); printlna//trueprintlnlist//[Java]list<<"F#"printlnlist//[Java, F#]printlnlist.remove("F#") //trueprintlnlist//[Java]printlnlist-"Java"// []list.addAll(["java","C#"]) list.each { println"$it"} /*JavajavaC#*/list.eachWithIndex { it, i -> println"$i: $it"} /*0: Java1: java2: C#*/ele=list.contains( 'java' ) printlnele//trueprintln'java'inlist//trueCollections.replaceAll(list,"java","Groovy") printlnlist//[Java, Groovy, C#]//////////////////////////////////////////////////////////////////////////定义map类型defmyMap= [:] myMap.put("XH",'123') myMap.put("Name",'Jack') myMap.each { println"$it.key: $it.value" } myMap.eachWithIndex { it, i -> println"$i: $it"} /*XH: 123Name: Jack0: XH=1231: Name=Jack*/printlnmyMap.containsKey('Name') //trueprintlnmyMap.containsValue('jack') // false 区分大小写printlnmyMap.keySet() //[XH, Name]printlnmyMap.values() //[123, Jack]//for迭代mapx=""for ( einmyMap ) { x+=e.valuex+=" "} printlnx//////////////////////////////////////////////////////////////////////////函数定义defsayMsg(msg="Groovy"){ "Hello,$msg"} printlnsayMsg() //Hello,GroovyprintlnsayMsg('Java') //Hello,Java//////////////////////////////////////////////////////////////////////////if分支deffunc_if(x=0){ if(x<0) { println"<0" } elseif(x<20) { println"[0,20)" } else { println">20" } } printlnfunc_if(20) //null//for循环deffunc_for(){ defx=0for (iin0 .. 10) { x+=i } printlnx//55x=0for( iin [1,2,3,4,5,6,7,8,9,10] ) { x+=i } printlnx// 55} func_for() //////////////////////////////////////////////////////////////////////////Expando动态Bean类型,支持添加属性和方法defuser=newExpando(name:"Jack") printlnuser//{name=Jack}user.xh="123"printlnuser//{name=Jack, xh=123}user.info= { println"Name: $name,XH:$xh"} user.info() //Name: Jack,XH:123//////////////////////////////////////////////////////////////////////////扩展方法 和 MetaprogrammingString.metaClass.xxxFunc= { println"xxxFunc"} "str"?.xxxFunc() //xxxFunc////////////////////////////////////////////////////////////////////////classTestGroovyInterceptableimplementsGroovyInterceptable { defsum(Integera, Integerb) { a+b } definvokeMethod(Stringname, args) { println"Invoke method: $name,args: $args" } } deftest=newTestGroovyInterceptable() //Invoke method: sum ,args: [2, 3]test?.sum(2,3) //Invoke method: power,args: [2, 3]test?.power(2,3) ////////////////////////////////////////////////////////////////////////importgroovy.transform.TypeChecked//类型检测IntegertestTypeCheck() { //[Static type checking] - //Cannot assign value of type java.lang.String to variable of type java.lang.IntegerIntegernum="1"returnnum} ////////////////////////////////////////////////////////////////////////importgroovy.transform.CompileStatic//静态方法intsum(intx, inty) { x+y} sum(2,7) //9//////////////////////////////////////////////////////////////////////////类classStudent { //只读finalStringname="Jack"Integerage=0protectedvoidsetAge(Integerage) { this.age=age } definfo(){ "$name,$age,$tag" } //动态类型deftag} defstu=newStudent() stu.setAge(33) stu.tag= [1,2,3] printlnstu.info() //Jack,33,[1, 2, 3]//////////////////////////////////////////////////////////////////////////JSON处理importgroovy.json.JsonOutputdefstrJSON=JsonOutput.toJson([stu]) println(strJSON) //[{"age":33,"tag":[1,2,3],"name":"Jack"}]////////////////////////////////////////////////////////////////////////importgroovy.json.JsonSlurperdefjsonSlurper=newJsonSlurper() defobject=jsonSlurper.parseText('{ "name": "Jack", "xh" : "123"}') println(object.name) println(object.xh) ////////////////////////////////////////////////////////////////////////importgroovy.json.JsonSlurperdefjsonSlurper=newJsonSlurper() Objectlst=jsonSlurper.parseText('[2, 3, 4, 5]') lst.each { printlnit }