Groovy語法糖一覽

// no class declareation -> subclass of Script
package com.innohub.syntax

// 輸出太多,這個做爲一塊開始的標示
String hr = (1..10).collect{'***'}.join(' ')
def pp = {String str, obj ->
	println str.padRight(40, ' ') + obj
}

pp 'My Class', this.class.name
pp 'I am a Script object', this in Script

// *** 多變量賦值
def (aa, bb) = [1, 2]
pp 'aa is ', aa
pp 'bb is ', bb

// swap
(aa, bb) = [bb, aa]
pp 'aa is ', aa
pp 'bb is ', bb

// *** curry
def cl1 = {int a, b, c ->
	a + b + c
}
def cl1Curry1 = cl1.curry(1)
pp 'curry sum', cl1Curry1(2, 3)

// closure call itself
def sumRecurse = {int n ->
	n == 1 ? 1 : n + call(n - 1)
}
pp 'sum 10', sumRecurse(10)
// 參考:Groovy基礎——Closure(閉包)詳解 http://attis-wong-163-com.iteye.com/blog/1239819

// *** Object with
class Test {  
    def fun1() { println 'a' }  
    def fun2() { println 'b' }  
    def fun3() { println 'c' }  
}  
def test = new Test()  
test.with {  
    fun1()  
    fun2()  
    fun3()  
}  

// *** string/gstring
println hr

// 調用命令行
def process = "cmd /c dir".execute()
pp 'dir output', process.text

pp '1+1 = ?', '${1+1}'
pp '1+1 = ?', "${1+1}"
// 這裏寫sql之類的完爆StringBuffer吧,groovy編譯後用StringBuilder優化
pp '1+1 = ?', '''
	${1+1}
'''
pp '1+1 = ?', """
	${1+1}
"""

// *** pattern
println hr

// 難道全部的語言不都應該這麼寫正則自變量麼?
def pat = /^(\d+)$/
pp 'I am', pat.class.name
def patCompiled = ~/\d/
pp 'And you are', patCompiled.class.name

pp 'is 1234 match ? ', '1234' ==~ pat
// 須要中間變量
def mat = '1234' =~ pat
pp 'how 1234 match', mat[0][1]

// *** list/map/set
println hr

// 運算符重載
def ll = []
pp 'I am', ll.class.name
ll << 1
ll << 2
ll << 3
pp 'My length is', ll.size()

def set = [] as HashSet
pp 'I am', set.class.name
set << 1
set << 2
set << 2
pp 'My length is', set.size()

def map = [:] // as HashMap or HashMap map = [:]
map.key1 = 'val1'
pp 'R u a LinkedHashMap?', map instanceof LinkedHashMap

// 一堆語法糖
// 不完整的切片
pp 'Some of me', ll[1..-2]

pp 'I have 2', 2 in set

// 和instanceof同樣
class Parent implements Comparable{
	int money

	// 重載
	def Parent plus(Parent another){
		new Parent(money: this.money + another.money)
	}

    def int compareTo(obj){
		if(obj in Parent)
			this.money - obj.money

		0
	}
}
class Child extends Parent {
    
}

def p1 = new Parent(money: 100)
def p2 = new Parent(money: 200)
pp 'My parent is richer', p1 < p2
def p3 = p1 + p2
pp 'Let us marry, our money will be', p3.money

def child = new Child()
pp 'My son', child in Child
pp 'My son like me', child in Parent

// each every any collect grep findAll find eg.

def listOfStudent = [[name: 'kerry'], [name: 'tom']]
pp 'your names?', listOfStudent*.name.join(',')

def calSum = {int i, int j, int k ->
	i + j + k
}
pp 'let us do math', calSum(*ll)

// 哎,費腦筋啊
def listFromRange = [*(1..20)]
pp 'another', listFromRange.size()

// *** io
println hr

// 又一堆語法糖
// eg. new File('蒼井空.av').newOutputStream() << new Url(url).bytes
def f = new File('MakeYouPleasure.groovy.output')
f.text = 'xxx'
f.newOutputStream() << 'yyy'
pp 'file content', f.text.size()

f.withPrintWriter{w ->
	w.println 'zzz'
}
pp 'file line number', f.readLines().size()

// *** ==
println hr

pp 'oh aa == aa of cause', 'aa' == "aa"
String num = 'aa'
pp 'again?', 'aa' == "${num}"

pp 'number is number, string is string', 0 == '0'

// 這裏須要(),或要有中間變量
pp 'list match!', [1, 1] == [1, 1]
pp 'map match!', ['a':'1'] == ['a':'1']

// 這裏用is進行引用比較
pp 'two lists', [1, 1].is([1, 1])

// *** if
println hr

pp "'' is", !''
pp "'1' is", !'1'
pp "[] is", ![]
pp "[1] is", ![1]
pp "[:] is", ![:]
pp "[1:1] is", ![1:1]
pp "0 is", !0
pp "1 is", !1

// *** null if
println hr

def one = null
pp 'null name is null', one?.name
one = [name: 'kerry']
pp 'my name is', one?.name

// *** as/closure
println hr

pp '1 is a integer, yes', '1' as int

// refer asType

def list4as = [2, 3]
def strs = list4as as String[] // or String[] strs = list4as
pp 'list can be array', strs

class User {
    int age

	boolean isOld(){
		age > 50
	}
}

interface Operator {
	def doSth()
}

// get/set方法省略不用寫,造數據也簡單
def user = [age: 51] as User
pp 'map can be object, is it old?', user.isOld()

// 接口也同樣,可是都是不要類型和參數
def myOperator = [doSth: {
	10
}] as Operator
pp 'closure can be a method, do sth!', myOperator.doSth()

// Closure是一個類實例,當時一等公民
def doSth = myOperator.&doSth
pp 'do again', doSth()

// 因此能夠付給其餘對象,這裏很像js裏的prototype吧
Parent.metaClass.hello = doSth
pp 'do again, but why u?', child.hello()

Parent.metaClass.hi = {String name, int age ->
	// 變老了
	name + ((age ?: 0) + delegate.hello())
}
pp 'how old?', child.hi('son', 5)

// *** assert
println hr

assert 1 == 1

// *** ant builder
println hr

def ant = new AntBuilder()
// 這就是語法變種,省略了括號,閉包通常都是最後一個參數
// 看gradle的文件時候,別覺得那是配置文件,那個也是groovy。。。
ant.echo message: 'hi'
ant.copy todir: '/', {
	fileset dir: './', {
		include name: 'Make*.groovy'
	}
}
// 固然ant全部的功能這裏都有,refer gygy.groovy

// SwingBuider/MarkupBuilder略

// *** xml
println hr

def parser = new XmlParser()
def root = parser.parseText('''
<dept name="one">
	<student name="1" />
	<student name="2" />
</dept>
'''
)
root.student.each{
	pp 'student name', it.@name
}


// 還有grape,不過如今都是gradle了
// 還有Sql組件

// 其實上面都是語法糖,面向metaClass的都尚未,這個纔是這個語言最核心的設計了,你們多看些例子
相關文章
相關標籤/搜索