当前位置: 首页 > 后端技术 > Java

Y分钟Groovy

时间:2023-04-01 18:22:55 Java

源码下载:learngroovy-cn.groovyGroovy-Java平台的动态语言,了解更多。/*安装:1)安装GVM-http://gvmtool.net/2)安装Groovy:gvminstallgroovy3)启动groovy控制台,键入:groovyConsole*///双斜杠开始单行注释/*like这是一个多行注释*///HelloWorldprintln"Helloworld!"/*变量:变量可以赋值以后使用*/defx=1printlnxx=newjava.util.Date()printlnxx=-3.1499392printlnxx=falseprintlnxx="Groovy!"printlnx/*Collectionsandmaps*///创建一个空列表deftechnologies=[]/***Addanelementtothelist***///和Java一样astechnologies.add("Grails")//向左添加,返回列表technologies<<"Groovy"//添加多个元素technologies.addAll(["Gradle","Griffon"])/***从列表中删除elementsin***///同Javatechnologies.remove("Griffon")//减号也是可用的technologies=technologies-'Grails'/***遍历列表***///遍历元素在列表中technologies.each{println"Technology:$it"}technologies.eachWithIndex{it,i->println"$i:$it"}/***检查列表内容***///确定列表是否包含一个元素,返回booleancontained=technologies.contains('Groovy')//orcontained='Groovy'intechnologies//检查多个elementtechnologies.containsAll(['Groovy','Grails'])/***listsorting***///排序列表(修改原列表)technologies.sort()//如果不想修改原列表,你可以这样做:sortedTechnologies=technologies.sort(false)/***列表操作***///替换列表元素Collections.replaceAll(technologies,'Gradle','gradle')//打乱列表Collections.shuffle(technologies,newRandom())//清空列表technologies.clear()//创建空图defdevMap=[:]//增加值devMap=['name':'Roberto','framework':'Grails','language':'Groovy']devMap.put('lastName','Perez')//遍历地图元素devMap.each{println"$it.key:$it.value"}devMap.eachWithIndex{it,i->println"$i:$it"}//判断map是否包含某个keyassertdevMap.containsKey('name')//判断map是否包含某个valueassertdevMap.containsValue('Roberto')//获取map的所有keyprintlndevMap.keySet()//获取map的所有valueprintlndevMap.values()/*GroovyBeansGroovyBeans是JavaBeans,但是使用更简单语法当Groovy编译成字节码时,遵循以下规则*如果名称声明带有访问修饰符(public、private或protected),将生成一个字段。*如果声明名称时没有访问修饰符,则会生成一个带有公共getter和setter的私有字段,即property。*如果一个属性声明为final,将创建一个final私有字段,但不会生成setter。*您可以在声明属性时定义自己的getter和setter。*可以声明一个属性和一个同名的字段,这将使用该字段。*如果要定义私有或受保护的属性,则必须提供声明为私有或受保护的getter和setter。*如果你使用显式或隐式的this(比如this.foo访问一个不存在的属性,Groovy会通过元类来访问它,这可能会导致运行时错误。*/classFoo{//只读属性finalStringname="Roberto"//带有公共getter和受保护setter的只读属性StringlanguageprotectedvoidsetLanguage(Stringlanguage){this.language=language}//动态类型propertydeflastName}/*逻辑分支和循环*///Groovy支持常见的if-else语法defx=3if(x==1){println"One"}elseif(x==2){println"Two"}else{println"XgreaterthanTwo"}//Groovy也支持三元运算符defy=10defx=(y>1)?"worked":"failed"assertx=="worked"//for循环//利用区间(范围)遍历defx=0for(iin0..30){x+=i}//遍历listx=0for(iin[5,3,2,1]){x+=i}//遍历数组array=(0..20).toArray()x=0for(iinarray){x+=i}//遍历图defmap=['name':'Roberto','framework':'Grails','language':'Groovy']x=""for(einmap){x+=e.valuex+=""}assertx.equals("RobertoGrailsGroovy")/*运算符Groovy中的以下常用运算符支持重载:http://www.groovy-lang.org/operators.html#Operator-Overloading实用的groovy运算符*///展开运算符:将操作应用于聚合对象的所有元素deftechnologies=['Groovy','Grails','Gradle']technologies*。toUpperCase()//等同于technologies.collect{it?.toUpperCase()}//安全导航运算符:用于避免NullPointerExceptiondefuser=User.get(1)defusername=user?.username/*ClosuresGroovy闭包是像代码块或方法指针。它是一个代码定义,可以稍后执行有关详细信息,请参阅:http://www.groovy-lang.org/closures.html*///示例:defclos={println"HelloWorld!"}println"ExecutingtheClosure:"clos()//传递参数给闭包defsum={a,b->printlna+b}sum(2,4)//闭包可以引用参数以外的变量listdefx=5defmultiplyBy={num->num*x}printlnmultiplyBy(10)//只有一个参数的闭包可以省略参数的定义defclos={printit}clos("hi")/*Groovy可以记忆闭包result[1][2][3]*/defcl={a,b->sleep(3000)//模拟耗时操作a+b}mem=cl.memoize()defcallClosure(a,b){defstart=System.currentTimeMillis()mem(a,b)println"Inputs(a=$a,b=$b)-${System.currentTimeMillis()-start}毫秒。"}callClosure(1,2)callClosure(1,2)callClosure(2,3)callClosure(2,3)callClosure(3,4)callClosure(3,4)callClosure(1,2)callClosure(2,3)callClosure(3,4)/*ExpandoExpando类是一个动态bean类,可以给Instances添加属性和添加闭包作为方法http://mrhaki.blogspot.mx/2009/10/groovy-goodness-expando-as-dynamic-bean.html*/defuser=newExpando(name:"Roberto")assert'Roberto'==user.nameuser.lastName='Pérez'assert'Pérez'==user.lastNameuser.showInfo={out->out<<"Name:$name"out<<",Lastname:$lastName"}defsw=newStringWriter()printlnuser.showInfo(sw)/*元编程(MOP)*///AddbehaviorusingExpandoMetaClassString.metaClass.testAdd={println"weaddedthis"}Stringx="test"x?.testAdd()//拦截方法调用类TestimplementsGroovyInterceptable{defsum(Integerx,Integery){x+y}definvokeMethod(Stringname,args){System.out.println"Invokemethod$namewithargs:$args"}}deftest=newTest()test?.sum(2,3)test?.multiply(2,3)//Groovy支持propertyMissing处理属性解析尝试classFoo{defpropertyMissing(Stringname){name}}deff=newFoo()assertEquals"boo",f.boo/*类型检查和静态编译Groovy本质上是并将永远是一种动态语言,但也支持类型更多信息检查和静态编译:http://www.infoq.com/articles/new-groovy-20*///typecheckingimportgroovy.transform.TypeCheckedvoidtestMethod(){}@TypeCheckedvoidtest(){testMeethod()defname="Roberto"printlnnaameee}//另一个例子importgroovy.transform.TypeChecked@TypeCheckedIntegertest(){Integernum="1"Integer[]numbers=[1,2,3,4]Datedate=numbers[1]return"Test"}//静态编译示例importgroovy.transform.CompileStatic@CompileStaticintsum(intx,inty){x+y}assertsum(2,5)==7AdvancedResourcesGroovyDocumentationGroovywebconsoleJointheGroovyUserGroupBooksGroovyGoodnessGroovyinActionProgrammingGroovy2:DynamicProductivityfortheJavaDeveloperhttp://roshandawrani.wordpres...http://www.solutionsiq.com/re...http://mrhaki.blogspot.mx/201...有建议吗?还是发现了什么不对?在Github上打开一个问题,或者发起一个pullrequest!最初由RobertoPérezAlcolea撰写,由0名善良的人修改翻译:ToddGao?2022RobertoPérezAlcolea本作品已在CCBY-SA3.0许可下获得许可。