Groovy學習筆記

Groovy控制檯 java

  • Groovy編譯:groovyc filename.groovy
  • Groovy運行:groovy filename
  • Groovy控制檯:groovyConsole

       

    默認導入 正則表達式

  • groovy.lang.*
  • groovy.util.*
  • java.lang.*
  • java.io.*
  • java.math.BigDecimal.*
  • java.math.BigInteger.*
  • java.net.*
  • java.util.*

       

    動態類型 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代碼的方法

  • 使用Bean Scripting Framework(BSF),即JSR 233
  • 使用GroovyShell
  • 使用GroovyClassLoader
  • 使用GroovyScriptEngine
  • 使用嵌入式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");

相關文章
相關標籤/搜索