Groovy控制檯 java
默認導入 正則表達式
動態類型 shell
1 安全 2 dom 3 jvm 4 函數 5ui |
x = new Date(); lua x = 1; //動態類型 spa
double y = -3.1415926; y = new Date(); //靜態類型,出現錯誤
|
列表與映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
jvmLanguages = ["java","Groovy","Scala","Clojure"]; println(jvmLanguages[0]); println(jvmLanguages.size()); println(jvmLanguages[0..2]); println(jvmLanguages[-1]); jvmLanguages = []; println(jvmLanguages);
languagesRatings = [Java:100, Groovy:99, Clojure:"N/A"]; println(languagesRatings["java"]); println(languagesRatings.Clojure); languagesRatings["Clojure"] = 75; languagesRatings = [:]; println languagesRatings;
|
可選的語法
1 2 3 4 5 6 7 |
public class Test{ public Integer doStuff(){ def x = 1 //沒有分號 def y; def String z = "Hello"; x = 3 //默認返回 } }
|
1 2 |
println("It's Groovy baby, year!") //等同於 println "It's Groovy baby, year!"
|
訪問限定符與比較操做
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Test{ //默認爲public
Integer x = new Integer(2) Integer y = new Integer(2) Integer z = null
Integer doStuff(){ //默認爲public if (x == y){ //隱含equals()調用 println "x==y" } if (!x.is(y)){ //檢查對象是否相等 println "x is not y" } if (z.is(null)){ //檢查是否爲null println "z is null" } if (z == null){ //檢查是否爲null println "z is null" } } }
|
GroovyBean
1 2 3 4 5 6 |
class Character{ private int strength private int wisdom } def pc = new Character(strength:10, wisdom:15) //bean初始化 pc.strength = 15 //set方法
|
安全解引用操做符
1 2 3 4 |
people = [null, new Person(name:"liyongjie")] for (Person person : people){ println people?.name }
|
貓王操做符
1 2 3 4 5 6 7 |
// Java String agentStatus = "Active"; String status = agentStatus != null ? agentStatus : "Inactive"; // Groovy String status = agentStatus ? agentStatus : "Inactive" // or String status = agentStatus ? "Inactive"
|
加強型字符串GString和跨行字符串
1 2 3 4 5 6 7 |
//GString,不能用於映射中的鍵或者比較是否相等 String name = "liyongjie" def dist = 3 * 2 String crawling = "${name} is crawling ${dist} feet!" //跨行字符串 """This GString wraps over two lines"""
|
函數字面值
1 2 3 4 5 6 7 8 |
def sayHello = { name -> if (name == "Martijn" || name == "Ben") "Hello author" + name + "!" else "Hello reader" + name + "!" } println(sayHello("Martijn"))
|
內置的集合操做
方法 |
描述 |
each |
遍歷集合,對其中的每一項應用函數字面值 |
collect |
收集在集合中每一項上應用函數字面值的返回結果(至關於其餘語言map/reduce中的map函數) |
inject |
用函數字面值處理集合並構建返回值(至關於其餘語言裏map/reduce中的reduce函數) |
findAll |
找到集合中全部與函數字面值匹配的元素 |
max |
返回集合中的最大值 |
min |
返回集合中的最小值 |
1 2 3 4 |
movieTitles = ["seven","show","hard"] movieTitles.each({x -> println x}) // 使用隱含的it變量 movieTitles.each({println it})
|
對正則表達式的內置支持
方法 |
描述及Java中的對等物 |
~ |
建立一個模式(建立一個編譯的Java Pattern對象) |
=~ |
建立一個匹配器(建立一個Java Matcher對象) |
==~ |
計算字符串(至關於在Pattern上調用match()方法) |
1 2 3 4 5 6 7 |
Pattern pattern = Pattern.compile("1010"); String input = "1010"; Matcher matcher = pattern.matcher(input); if (input.matches("1010")){ input = matcher.replaceFirst("0101"); System.out.println(input); }
|
1 2 3 4 5 6 7 8 9 10 |
def pattern = /1010/ def input = "1010" def matcher = input =~ pattern if (input ==~ pattern){ input = matcher.replaceFirst("0101") println input }
( "Hazel 1" =~ /(\w+)(\d+)/ ).each {full, name, age -> println "${name} is ${age} years old."}
|
簡單的XML處理
構造XML
1 2 3 4 5 6 7 |
def writer = new StringWriter() def xml = new groovy.xml.MarkupBuilder(writer) xml.person(id:2) { name "Gweneth" age 1 } println.writer.toString() |
輸出的XML爲:
1 2 3 4 |
<person id='2'> <name>Gweneth</name> <age>1</age> </person>
|
集中解析XML的方法
方法 |
描述 |
XMLParser |
支持XML文檔的GPath表達式 |
XMLSlurper |
跟XMLParser相似,但以懶加載的方式工做 |
DOMCategory |
用一些語法支持DOM的底層解析 |
解析XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class XmlExample { static def PERSON = """ <person id='2'> <name>Gweneth</name> <age>1</age> </person> """ } class Person {def id; def name; def age}
def xmlPerson = new XMLParser(). parseText(XmlExample.PERSON) Person p = new Person(id:xmlPerson.@id, name:xmlPerson.name.text(), age:xmlPerson.age.text()) println "${p.id}, ${p.name}, ${p.age}"
|
Groovy與Java的合做
tip:只須要把GROOVY_HOME/embeddable/Groovy-all-xxx.jar文件放到CLASSPATH中
下面是幾種從Java調用Groovy代碼的方法
GroovyShell
1 2 3 4 5 6 |
Binding binding = new Binding(); binding.setVariable("x", 2.4); binding.setVariable("y", 8); GroovyShell shell = new GroovyShell(binding); //設置shell上的binding Object value = shell.evaluate("x + y"); //計算並返回表達式 assert value.equals(new BigDecimal(10.4)); |
GroovyClassLoader
1 2 3 4 5 6 7 8 9 10 11 12 |
GroovyClassLoader loader = new GroovyClassLoader(); //準備類加載器 Class<?> groovyClass = loader.parseClass( new File("CalculateMax.groovy")); //從類文件獲得Class對象 GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); //生成實例對象 ArrayList<Integer> numbers = new ArrayList(); numbers.add(new Integer(1)); //準備參數 numbers.add(new Integer(10)); Object[] arguments = {numbers}; Object value = GroovyObject .invokeMethod("getMax", arguments); //調用groovy方法 assert value.equals(new Integer(10)) |
GroovyScriptEngine
1 2 3 4 5 6 7 8 |
String[] roots = new String[] {"/src/main/groovy"}; //設置根目錄 GroovyScriptEngine gse = new GroovyScriptEngine(roots); //初始化引擎 Binding binding = new Binding(); binding.setVariable("name","liyongjie");
Object output = gse.run("Hello.groovy", binding); //運行腳本 assert output.equals("Hello liyongjie"); |