マイ・コーディング・チートシート

[Groovy] マイ・コーディング・チートシート

Groovy Codingする時に、ちょっと書き方を思い出せない時にちら見するためのカンニングペーパーです。
色々なところから集めてきています。

/** Cheat sheet */

/** List */
ll = [11, 12, 13, 14]
[11, 12, 13, 14].add(2, 15)     // [11, 12, 15, 13, 14]
[11, 12, 13, 14].add([15, 16])  // [11, 12, 13, 14, 15, 16]
[11, 12, 13, 14].get(1)         // 12
[11, 12, 13, 14].isEmpty()      // false
assert ll.size()                ==4
[11, 12, [13, 14]].flatten()    // [11, 12, 13, 14]
assert ll.getAt(1)              == 12
assert ll.getAt(1..2)           == [12, 13]
[11, 12, 13, 14].getAt([2, 3])  // [13, 14]
[11, 12, 13, 14].intersect([13, 14, 15]) // [13, 14]
assert ll.pop()                 ==14
[11, 12, 13].add(14)            // [11, 12, 13, 14]
assert ll.reverse()             == [13, 12, 11]
assert ll.sort()                == [11, 12, 13]
assert ll.max()                 == 13

List lst = [1,2,3,4,5,6,7]
assert lst.count {it % 2 == 0 } == 3
assert lst.grep {it % 2 == 0 } == [2,4,6]
assert lst[0] == 1
assert lst[-1] == 7 // 最後の要素
assert lst << [8,9,10] == [1,2,3,4,5,6,7,[8,9,10]]


/** Map */
def mp = ['Ami':111, 'Bob':222 ]
mp.put('Carl',333) 
assert mp.containsKey('Bob') == true
assert mp.get('Ami', 111)    == 111
assert mp.get('Bob')         == 222
assert mp.get('Billy')       == null
println mp.keySet()          // [Ami, Bob, Carl]
assert mp.size()             == 3
assert mp['Bob']             == 222
assert mp.count {k,v -> k == 'Bob' || v==111 } == 2
assert mp.containsKey('Ami')


/** range */
def twentiethCentury = 1900..1999 // Range literal
def reversedTen = 10..1     // Reversed Range
assert twentiethCentury.size()    == 100
assert twentiethCentury.get(0)    == 1900
assert twentiethCentury.getFrom() == 1900
assert twentiethCentury.getTo()   == 1999
assert twentiethCentury.contains(2000) == false
assert twentiethCentury.subList(0, 5) == 1900..1904
assert reversedTen[2] == 8
assert reversedTen.isReverse() == true


/** String */
def hello='Hello'
assert hello.compareToIgnoreCase('hello')  == 0
assert hello.concat('world')           == 'Helloworld'
assert hello.endsWith('lo')            == true
assert hello.equalsIgnoreCase('hello') == true
assert hello.indexOf('lo')             == 3
assert 'Hello world'.indexOf('o', 6)   == 7
assert hello.matches('Hello')          == true
assert hello.matches('He')             == false
assert hello.replaceAll('l', 'L')      == 'HeLLo'
assert 'Hello world'.split('l')        == ['He', '', 'o wor', 'd']
assert hello.substring(1)              == 'ello'
assert hello.substring(1, 4)           == 'ell'
assert hello.toUpperCase()             == 'HELLO'
assert hello.center(11)                == '   Hello   '
assert hello.center(3)                 == 'Hello'
assert hello.center(11, '#')           == '###Hello###'
hello.eachMatch('.') { ch -> print ch }  // print H e l l o 
assert hello.getAt(0)                  == 'H'
assert hello.getAt(0..<3)              == 'Hel'
assert hello.getAt([0, 2, 4])          == 'Hlo'
assert "ABCDEFG".getAt( [0, 2, 4] )    == "ACE"
hello.leftShift('world')              // 'Helloworld'
hello << 'world'                      // Hello world  
assert hello.minus('ell')              == 'Ho'
assert hello - 'ell'                   == 'Ho'
assert hello.padLeft(4)                == 'Hello'
assert hello.padLeft(11)               == '      Hello'
assert hello.padLeft(11, '#')          == '######Hello'
assert hello.padRight(4)               == 'Hello'
assert hello.padRight(11)              == 'Hello      '
assert hello.padRight(11, '#')         == 'Hello######'
hello.plus('world')                // Hello world
hello + 'world'                    // Hello world
hello.replaceAll('[a-z]') { ch -> ch.toUpperCase() } // HELLO
assert hello.reverse()                 == 'olleH'
assert hello.toList()                  == ['H', 'e', 'l', 'l', 'o']
hello = 'Hello world'
hello.tokenize()                   // ['Hello', 'world']
hello.tokenize('l')                // ['He', 'o wor', 'd']

assert 'hello my friend.'.tokenize(/ +/)*.capitalize().join(' ') == 'Hello My Friend.'

// 部分除去
str = "goooooooooooooogle"
str = str.toList()
str[1..14] = ''
str = str.join()
assert str == "ggle"

/** Metaclass操作*/
Object.metaClass.divIt = { ->
	if (delegate != 0 ) {
		return Math.round(Math.floor(delegate.toInteger()/2.toDouble()))
	} else {
		return delegate
	}
}
assert 101.divIt()==50
assert 0.divIt()==0

/** Regular expression */
assert "aaa" =~ /a/         // 内包一致
assert "a"   ==~/a/         // 完全一致
assert "AAABBBCCC".replaceAll(/(.*)BBB(.*)/) {m0, m1, m2 -> "${m1}${m2}" } == "AAACCC" // 中間部分削除

/** for */
for (int i: 1 .. 3) { print i+ " " }         // 1 2 3
for (String s: "a" .. "c") { print s + " " } // a b c
String input = "ABC"
for (int i: 0 .. input.size()-1) {print input.getAt(i) + " "}  // Java形式は型宣言必要
for (  i in 0 .. input.size()-1) {print input.getAt(i) + " "}  // Groovy独自形式

/** Math  */
assert Math.round(876.543) == 877 // 四捨五入
assert Math.ceil(876.543)  == 877 // 切り上げ
assert Math.floor(876.543) == 876 // 切り捨て
assert Math.abs(-1)        == 1
assert Math.max(10,20)     == 20
assert Math.sqrt(9)        == 3.0

/** swap */
def list = [1, 2]
Collections.swap(list, 0, 1)
assert [2, 1] == list

def a = 1, b = 2
(a, b) = [b, a]
assert a == 2
assert b == 1

def map = [x:1, y:2]
map.with {
  (x, y) = [y, x]
}
assert [x:2, y:1] == map

class Person {
	def firstname
	def lastname
	Person(f,l) {
		firstname=f
		lastname =l
	}
}
Person p = new Person('First','Last')
println "\nBefore : "+ p.firstname +" "+ p.lastname 
p.with { (firstname, lastname) = "First2 Last2".split() } // ok
println "After  : "+ p.firstname +" "+ p.lastname 

/** Random */

IntRange.metaClass.define {
    random {
        int from = delegate.isReverse() ? to : from
        int to   = delegate.isReverse() ? from : to
        int size = to - from + 1
        (Math.floor(Math.random() * size) + from) as int
    }
}    // 範囲内でランダム

// パーセント計算
Number.metaClass.getProperty = { propertyName ->
    if (propertyName == 'percent') { delegate / 100 }
    else { delegate }
}
assert 20.5.percent== 0.205
assert 20.percent == 0.2


1000.times{
    assert (0..4).random() in (0..4), '0〜4の値がランダムに返ってくるはず'
}
//println (0..4).random() in (0..4)

/** char number  conversion*/
def charset = 'us-ascii'
assert  'groovy'.getBytes(charset) == [103, 114, 111, 111, 118, 121]
assert 'groovy' == new String([103, 114, 111, 111, 118, 121] as byte[], charset) // character codes to string
String.metaClass.static.fromBytes << { charsetName, List bytes -> new String(bytes.toArray() as byte[], charsetName) }
String.metaClass.static.fromBytes << { charsetName, Object... bytes -> new String(bytes as byte[], charsetName) }
assert 'groovy' == String.fromBytes(charset, [103, 114, 111, 111, 118, 121])
assert 'groovy' == String.fromBytes(charset, 103, 114, 111, 111, 118, 121)


/** コレクション操作 */
list = ['a','b','c','d'] 
newList = [] 
list.collect( newList ) { 
  it.toUpperCase() 
} 
assert newList == ["A", "B", "C", "D"]


/** クロージャー */
def clos = { aa, bb ->  aa+bb } 
assert clos( 5, 7 ) == 12


//エルビス演算子 nullなら初期値を代入
def name 
displayName = name ?: 'Anonymous'