Yokohama.groovy #4 を開催してきた #yokohamagroovy

開催されているのは9/18ですがこれを書いているのは大分日が経ってからの事。うぅイカイカン(^_^;)

開催会場はこれまで通り横浜タネマキ。

写経・実践

この日実践した範囲は『3.7 コレクション型』(P.80)から『演算子オーバーロード』の辺りまで。

全般的に参照したのはこの辺りのエントリ。

リスト
def list = [11,22,33,44,55]
assert list.equals([11,22,33,44,55])     // 等しい事を確認

assert list.first() == 11   // first:最初の要素を取得

assert list.getAt(2) == 33  // getAt:指定位置の要素を取得

assert list.head() == 11    // head:最初の要素を取得
assert list.last() == 55    // last:最後の要素を取得

assert ["A","B","C","D","E"].minus(["A","C","D"]) == ["B","E"]  // minus:指定要素を削除

assert [1,2,3].pop() == 3   // pop:リストの最後の要素を取得(リストからは削除される)

def listnum = [10, 20, 30]
listnum.push(40)    // push:リストの最後に指定要素を追加
assert listnum == [10, 20, 30, 40]

assert ["ひ", "ら", "な", "べ"].reverse() != ["ひ", "ら", "な", "べ"]   // reverse:要素を逆順にしたリストを作成(XP祭り2012名言)
assert ["ひ", "ら", "な", "べ"].reverse() == ["べ", "な", "ら", "ひ"]   // reverse:要素を逆順にしたリストを作成(XP祭り2012名言)

assert [31, 32, 33].tail() == [32, 33]  // tail:リストの最初の要素以外を取得
コレクション

参考ページはこちら。

package main.java

/**
 * Created with IntelliJ IDEA.
 * User: shinyaa31
 * Date: 12/09/29
 * Time: 10:12
 * To change this template use File | Settings | File Templates.
 */
println(2)
def list = [1, 2, 3]
assert list.containsAll([1, 2, 3])  // containsAll:指定要素が全て含まれているかを確認
assert list.contains(2)             // contains:指定要素が含まれているかを確認
assert ['上','上','下','下','左','右','左','右','B','A'].count('右') == 2    // count:指定要素の件数確認

// find:見つからない場合Nullが返ってくる。見つかった場合オブジェクトが返ってくる。
assert (1..20).find { it % 3 == 0 } == 3    // クロージャがtrueを返す最初の要素
assert (1..20).findAll { it % 3 == 0 } == [3,6,9,12,15,18]  // クロージャがtrueを返す全ての要素

// flatten:入れ子になったリストを平坦化(ツリー構造要素から要素一覧を取得する時等に使える)
assert [1,2,3,4,5] == [1,[2,3],[[4]],[],5].flatten()

// groupBy:クロージャで指定された条件で要素をグループ化し、Mapを返す
assert [0:[2,4,6], 1:[1,3,5]] == [1,2,3,4,5,6].groupBy { it % 2 }

// intersect:Collection要素同士の重複抽出
assert [1,2,3,4,5].intersect([3,4,5,6,7]) == [3,4,5]

// join:Collectionの各要素を指定区切り文字列で連結
assert ["2012","9","28"].join("/") == "2012/9/28"

// max,min:最大値、最小値を返す
assert [1,100,10000].max() == 10000
assert [1,100,10000].min() == 1

// plus:コレクション同士を連結
assert [1,2,3].plus([4,5,6]) == [1,2,3,4,5,6]

// sort:要素のソート
assert [9,4,10,3,3,2].sort() == [2,3,3,4,9,10]

// sum:要素の合計
assert [10,20,30,40,50,60,70,80,90,100].sum() == 550

// unique:重複削除
assert [10,20,30,20,30,10,30].unique() == [10,20,30]

sortやuniqueについては以下のエントリ等もとても参考になります。

クロージャ内でのインデックス(Javaにおけるfor文内のインデックス)についてはこの辺が引っ掛かりました。

GExcelAPI

リストやコレクションについて進めていく過程で、GExcelAPIというものがGroovyのこれらの機能を利用している・勉強になるという話に。

Map

書籍ではそこまで言及されていないGroovyとMapの関連ですが、この回でもそんなに言及は無し。


Mapではあるが、プロパティのアクセスなどについてはJavaBeansと同じような形でアクセス出来る事は少し前に別の写経でも触れた。

Groovy特有の演算子

『3.8 演算子』では、『*.』(展開ドット:全メンバに適用したリスト)に言及。こちらはGradle等でも良く利用されているもの。

task quickStart << {
    sourceSets*.allSource*.srcDirs.flatten().each { it.mkdirs() }
}