聊城专业网站设计公司,代运营公司怎么收费,WordPress 弹出二维码,网页设计与制作做网站前言Why初次接触到Groovy是在实习中接触到一个 纯Groovy写的项目#xff0c;当时看了下这不就是没有分号的Java么#xff0c;而且也是有年纪的语言了#xff0c;并不想投入时间学习。后来工作中越来越多的看到Groovy的身影#xff0c;Gradle#xff0c;Spring Cloud Contr…前言Why初次接触到Groovy是在实习中接触到一个 纯Groovy写的项目当时看了下这不就是没有分号的Java么而且也是有年纪的语言了并不想投入时间学习。后来工作中越来越多的看到Groovy的身影GradleSpring Cloud Contract等等都支持Groovy作为DSL(领域专用语言)同时Groovy在测试领域也有一席之地因为语法简单可以很快捷的编写Test Case总之可以把Groovy看作Java的小伙伴好帮手。WhatGroovy是JVM平台上的一种面向对象且同时支持静态动态的脚本语言语法和Java区别不大提供了一些语法糖代码的表达能力更强。默认小伙伴们都已经有了Java基础本文主要介绍Groovy比Java多出的语法糖以及使用较多的DSL。语法糖大致了解一些语法糖可以更舒服的看DSL可以用def关键字定义变量和方法编译期做类型推断多变量同时创建def (aa, bb) [1, 2]范围创建int[] range 0..10;支持for in写法for(variable in range) {statement #1statement #2…}方法参数支持默认值def someMethod(parameter1, parameter2 0, parameter3 0) {// Method code goes here}字符串支持单引号和双引号类似于shellpython双引号中可识别变量列表创建List strings [g, r, o, o, v, y]map创建Map stringMap [name: wang, age: 99]正则表达式后面直接跟正则语句可直接用于判断if ( Groovy ~ ^G)trait关键字声明一个可以有属性和默认实现的接口Java8之后的接口也都能达到同样效果支持闭包自己Call自己def closure { param - println Hello ${param} };closure.call(World);10.times {num - println num}函数科里化贼方便def cl1 {int a, b, c -a b c}def cl1Curry1 cl1.curry(1)调用shell方便println ls -l.execute().textinstanceof可以简写成inDSL链式调用在不产生歧义的情况下我们可以省略方法调用中的括号使代码更像说话// equivalent to: turn(left).then(right)turn left then right// equivalent to: take(2.pills).of(chloroquinine).after(6.hours)take 2.pills of chloroquinine after 6.hours// equivalent to: paint(wall).with(red, green).and(yellow)paint wall with red, green and yellow// with named parameters too// equivalent to: check(that: margarita).tastes(good)check that: margarita tastes good// with closures as parameters// equivalent to: given({}).when({}).then({})given { } when { } then { }运算符重载OperatorMethoda ba.plus(b)a - ba.minus(b)a * ba.multiply(b)a ** ba.power(b)a / ba.div(b)a % ba.mod(b)a | ba.or(b)a ba.and(b)a ^ ba.xor(b)a or aa.next()a-- or --aa.previous()a[b]a.getAt(b)a[b] ca.putAt(b, c)a ba.leftShift(b)a ba.rightShift(b)a ba.rightShiftUnsigned(b)switch(a) { case(b) : }b.isCase(a)if(a)a.asBoolean()~aa.bitwiseNegate()-aa.negative()aa.positive()a as ba.asType(b)a ba.equals(b)a ! b! a.equals(b)a ba.compareTo(b)a ba.compareTo(b) 0a ba.compareTo(b) 0a ba.compareTo(b) 0a ba.compareTo(b) 0脚本基类我们运行的Groovy脚本在编译过程中都自动继承了 groovy.lang.Script 这个抽象类并把脚步内容绑定到run方法中执行。可以通过创建一个Binding在脚本和基类中创建公用的变量def binding new Binding()def shell new GroovyShell(binding)binding.setVariable(x,1)binding.setVariable(y,3)shell.evaluate z2*xyassert binding.getVariable(z) 5可以自定义基类class BaseScript extends Script{String namepublic void greet() { println Hello, $name! }OverrideObject run() {greet()}}BaseScript demo.BaseScript baseScriptsetName 100greet()DelegatesTo是一个文档与编译时注释当我们使用了委托模式去执行闭包时文档生成IDE以及类型推断都无法准确知道闭包具体被委托到哪里执行我们就需要使用此注解显示声明。当我们要实现如下效果时我们需要定义一个email方法接受一个闭包然后通过构建模式创建一个EmailSpec去初始化并且委托执行闭包email {from dsl-gurumycompany.comto john.doewaitaminute.comsubject The pope has resigned!body {p Really, the pope has resigned!}}def email(DelegatesTo(strategyClosure.DELEGATE_ONLY, valueEmailSpec) Closure cl) {// ...}当我们要委托给方法的另一个参数时可以def exec(DelegatesTo.Target Object target, DelegatesTo Closure code) {// rehydrate方法创建一个闭包副本def clone code.rehydrate(target, this, this)clone()}自定义编译器增加默认导入并且支持别名import org.codehaus.groovy.control.customizers.ImportCustomizerdef icz new ImportCustomizer()// normal importicz.addImports(java.util.concurrent.atomic.AtomicInteger, java.util.concurrent.ConcurrentHashMap)// aliases importicz.addImport(CHM, java.util.concurrent.ConcurrentHashMap)// static importicz.addStaticImport(java.lang.Math, PI) // import static java.lang.Math.PI// aliased static importicz.addStaticImport(pi, java.lang.Math, PI) // import static java.lang.Math.PI as pi// star importicz.addStarImports java.util.concurrent // import java.util.concurrent.*// static star importicz.addStaticStars java.lang.Math // import static java.lang.Math.*可用于限制AST的级别比如使用者不能用闭包不允许导入其他包等等构建Groovy内置了很多好用的构建器具体使用查看官方教程[官方教程](