Groovy Bootcamp 2015 by JGGUG

86
JGGUG / NTTソフト道場 共催 今だから始めよう Groovyブートキャンプ20152015/08/07

Transcript of Groovy Bootcamp 2015 by JGGUG

JGGUG / NTTソフト道場 共催

今だから始めよう Groovyブートキャンプ2015夏 2015/08/07

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved.

準備

•演習マテリアル、準備などはこちらから

–https://github.com/uehaj/groovy-bootcamp2015

2

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 3

NTTソフト道場のご紹介 実務経験豊富な当社プロフェッショナル社員の実践経験から得られたノウハウを研

修カリキュラムとしてご提供します

Jenkins Android Grails/Groovy

モダンWebデザイン

OSSVERT・Web3層構築 仮想化

テストツール

NW構築

SW

運用管理セグメントSW

eth0 eth3

bond0

eth2

xen1/dom0

eth0

eth0

eth0

eth0

eth2 eth1

eth1

eth2

eth1

eth2

eth1

eth2

eth3eth0

bond0

WEB

xen2/dom0

eth0

eth0

eth0

eth0

eth2eth1

eth1

eth2

eth1

eth2

eth1

xenbr4

xen

br3

xenbr4

xen

br1

xen

br3

xen

br1

外部ネットワークSW外部セグメント

xen

br0

xen

br2

xen

br0

xen

br2

tag10

tag30

tag20

tag10

tag30

tag20

物理サーバ1 物理サーバ2

WEB

AP AP

DB DB

Apache Web ServerApache Web Server

Ultra Monkey

Heartbeat

PREX

CentOS5.5

OSS・DB

レガシーコード改善

セキュリティ

開発言語・フレームワーク

IPv6

開発テクニック

インフラ構築

ストレージ

CSS3

6年間で2000名以上の人材育成実績

H21年度 9カリキュラム 17回(講師10名) 受講者143名

H22年度 14カリキュラム 24回(講師16名) 受講者299名

H23年度 23カリキュラム 36回(講師23名) 受講者394名

H24年度 27カリキュラム 55回(講師47名) 受講者597名

H25年度 21カリキュラム 25回(講師50名) 受講者323名

H26年度 32カリキュラム 43回(講師58名) 受講者506名

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. Slide # Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 4

講師紹介

上原潤二(@uehaj) NTTソフトウェア株式会社Grails推進室

JGGUG(日本Grails/Groovyユーザグループ)運営委員

書籍執筆:

プログラミングGROOVY(技術評論社)

Grails徹底入門(翔泳社)

ブログ「Grな日々」

GroovyServ, LispBuilder, GVM(Groovy JVM), groovy-comprehension, groovyz Staticalizer開発者

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved.

準備1: Eclipseのインストール • Eclipseインストール

– https://eclipse.org/downloads/

• Groovy-Eclipseプラグインをインストール – [Help]->[Install new software]

• http://dist.springsource.org/milestone/GRECLIPSE/e4.4/

– Groovyプロジェクトを新規作成するか、既存プロジェクトをGroovyプロジェクトに変換

• もしくは、あらかじめGroovyプラグイン等が設定された状態にカスタマイズされたバージョンの配布パッケージ GGTSを使用する(GGTS=Groovy Grails Tool Suite)

– http://spring.io/tools/ggtsからダウンロード

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved.

Groovy単体でのインストール方法

• GVM Tool

– Linux, MacOSXでおすすめ

– Posh GVMというWindows Powershell版もあるが、利用が少し難しい(?)

• Windows Installer

– Windowsではおすすめだが今は微妙なところにある • https://bintray.com/groovy/Distributions/Windows-

Installer/groovy-2.4.3-installer/view#files

• 詳しくは – http://www.groovy-lang.org/download.html

6

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 7

Groovyとは

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 8

Groovyとは

• Java VM上で動作する動的なスクリプト言語 –構文はJavaとほぼ上位互換 –プラットフォームやセキュリティモデルは全く同じ

• OSSとして開発 –主要開発者はPivotal社(SpringSource部門)に所属

• ユニークな特徴 – Javaと共存・併用するための言語

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 9

Groovyについて識者の言

• GroovyプロジェクトリードGuillaume Laforge氏

– GroovyはJavaを置き換えようとして発想されたのではないことを思い出そう。Groovyは、Javaの補完であり、付属物であり、拡

張なんだ。これが、この言語とこのプロジェクトの、中核価値なんだ。

• Grails/GroovyコアコミッターGraeme Rocher氏「GroovyはJavaに取って代わるだろう」という記事に対してコメント:

– 面白い記事だけど、GrailsとGroovyコアコミッターとしてしては、同意できないね。;-) Groovyは来年には世界で使われているtop10言語の一つ、ひょっとしたら5位に迫るかもしれないけど、(Javaを)置き換えるだって?ノーだ。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 10

コード例: HelloWorld.java __

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello world");

}

}

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 11

コード例: HelloWorld.groovy

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello world");

}

}

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 12

コード例: HelloWorld.groovy

println "Hello world"

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 13

Groovyの特徴

簡潔 Javaとの親和性

柔軟 高機能

• Java技術者がすぐに習得できる • 既存のJava資産・製品(ツールやミドルウェア)を使い続けられる

• Javaシステムでも利用可能

• 動的言語 • 言語自身をカスタマイズするDSL • 本研修では対象外とする

• 多機能であり、生産性が高い • Javaより進化が速く、いち早く先進的な機能が取り込まれている

• Java比で1/4~1/10程度のコード量 • プログラムが小さくなることで、修正時の依存性やバグの減少効果も見込む

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 14

簡潔

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 15

コード例:Java

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 16

コード例:Groovy!

ポイント: 正しいJavaコードは一般に正しいGroovyコードでもある。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 17

よりGroovyなコード

ポイント:import文、クラス定義、セミ コロンなど多くを省略可

ポイント: java.net.Socketクラスやjava.io.*Streamクラスに自動closeなどの便利機能が追加されたメソッド(eachLine,

withStreams)が追加されている(GDK)

ポイント:プロパティアクセス記法(.bytes)はgetter(getBytes())を呼び出す

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 18

HTTPに限れば

JavaからGroovyに書き直すと、 大抵数分の1程度(1/4~)。

マップリテラル、リストリテラルなどもコードが短くなる要因として良く示される。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 19

簡潔に記述が可能

• import宣言(java.lang,io,net,util,..) • 例外宣言/try-catch • クラス定義、main • セミコロン • 型指定 • 引数の括弧(ブロックのトップレベルでのメソッド呼び出しのみ)

•その他 –メソッド末尾の”return”

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 20

短さの意味

• 「短かいこと」が重要なのではない – 「短くて分かりにくい」こともある

• 重要なのは「やりたい事(what)/コード量」のS/N比

– 短さは、「書きたいことを本来書くべきやり方で、書ける」を達成するための1ファクター

• 「書きたいこと以外の雑事によってわずらわされない」事が重要

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 21

Javaとの親和性

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 22

Javaと親和性が高い

• Java技術者がすぐに習得できる –教育コストが低い

–静的型付け、動的型付けの使い分けが可能

• GroovyプログラムはJVMから見て通常のJavaプログラムに見えるため、Javaとの連携が自由 –既存のJava資産・製品(ツールやミドルウェア)を使い続けられる

–蓄積してきたJava再利用部品を使いまわせる

– OSSVERT環境をそのままインフラとして利用できる

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved.

Groovyの実行の流れ

23

JVM

Javaソース

.classファイル

javacコマンド

javaコマンド

標準クラスローダ

Javaクラス

Groovyコード

groovyコマンド

Groovyクラスローダ (オンメモリ実行時コンパイラ)

Javaクラス Javaクラス

.classファイル

groovycコマンド

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 24

GroovyとJavaの連携例

• GroovyのREPLでJavaライブラリを試す – GroovyConsole、groovysh,..

• Java周辺ツール –ビルド: Gradle、テスト: Spock,Geb

• フレームワーク – Webアプリ開発: Grails

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 25

高機能

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 26

GDK (Groovy JDK)

• Java標準APIにGroovy処理系がメソッドを追加

• java.lang.Stringを例にとると、 – Java標準APIでは、65個のメソッド

– GDKでは、91個のメソッドを追加

• 便利なメソッド – lsコマンドを実行(Processインスタンスが返る)

"ls".execute()

– trコマンドと同様の文字列置換(“ABCDEFG”が帰る)

"abcdefg".tr("a-z", "A-Z")

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 27

Groovyで追加されたメソッドの例

java.lang.String のメソッド Groovyでの動作

int count(String text) 文字列内のtextの出現回数をカウント

byte[] decodeBase64() Base64エンコード文字列をバイナリに変換

byte[] decodeHex() 16進文字列をバイナリに変換

Process execute() 文字列をコマンドとして実行

String expand(int tabStop) Tab文字をtabStopで指定された数のインデントになるようスペースで置換する

boolean isDouble() Double型にパース可能かどうかを返す

String tr(String sourceSet, String replacementSet)

sourceSetで指定された範囲の文字列をreplacementSetで指定された範囲の文字列に置換する

String unexpand(int tabStop) 連続したスペースをTab文字に置換しtabStopで指定された数のインデントにする

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 28

GDKリファレンス

http://groovy.codehaus.org/groovy-jdk/

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 29

クロージャ

• コンテキストを持ったコードブロック(コード断片)

• Javaの「無名内部クラス」に近い機能 –無名内部クラス

Runnable r = new Runnable(){

public void run() {

System.out.println("hello");

}

};

– Groovyのクロージャ Closure c = { println "hello" }

• 「クロージャを引数に取るメソッド」による処理

但し、Javaの内部クラスにおける「非finalな

ローカル変数にはアクセスできない」という制約は無いので、より高機能である

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 30

Groovyプログラムの実行

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 31

Groovyの主な実行方法

• groovy コマンド • groovyc コンパイラ • groovysh コマンド • groovyConsole コマンド

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 32

groovyコマンド

• 単体スクリプトを起動する普通の起動方法

• groovyプログラムファイル名を引数にして起動する(拡張子省略可能)

• ごく短いコード(ワンライナー)を試すには –e

• コマンドライン引数(args)を与えることができる。

– WindowsではPATHEXT環境変数を設定したり、UNIXではスクリプト1行目に#!env groovyというshebang行を書くことでgroovyコマンドの明示的な実行指定を省略できる

$ groovy -e ‘println new URL(“http://~”).text’

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 33

groovycコマンド(AOTコンパイラ)

• GroovyプログラムをJavaクラスファイル(.class)にコンパイルできる

• groovyコードが普通のJavaクラスとなる

• mainが定義されていればjavaコマンドで実行可能

–但し実行にはクラスパスに$GROOVY_HOME/embeddable/groovy-all-*.jarが必要。

$ groovyc test.groovy # test.classが生成される

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 34

groovyshコマンド

• 対話的にGroovyコードを実行(REPL)

• (注意)ローカル変数(int x=…)は行を越えて 利用できないためバインディング変数を使う(x=…)

• Grailsでは以下が同等 $ grails shell

$ groovysh

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 35

groovyConsoleコマンド

• Swing GUIで対話的にGroovyコードを実行 –保存もできる。Undoもできる。 – Ctrl+Rで実行 – Ctrl+Wで出力クリア

• (注意)argsを指定できない • Grailsでは以下が同等機能

• GGTS/Eclipseでは右クリック[実行]-[GroovyConsole]で起動 – [Run as]-[Groovy Console]

$ grails console

$ groovyConsole

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 36

演習

• GGTS/Eclipseから groovyConsole を起動し、以下を実行してみる

println 1+1

(1..10).each{println it}

• ctrl-Rで実行

• ctrl-Wで出力結果の消去

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 37

groovyConsole補足 (1)

•ライブラリの動作確認に便利なGrape @Grab(group='~', module='~', version='~')

Mavenリポジトリを利用した依存関係の解決

(要Proxy設定)

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 38

groovyConsole補足 (2)

• Proxy設定(単独起動する場合)

環境変数 JAVA_OPTS に以下を設定する

-DproxyHost=proxy.hogehoge.co.jp

-DproxyPort=18080

※ 一行で書く

※ Tomcat や JBoss もこの環境変数を参照するため注意すること

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 39

groovyConsole補足 (3)

• Proxy設定(Eclipse/GGTSから使う場合)

[実行]→[実行構成] で [Groovy Console] を選択し、引数タブのVM引数に以下を加える。

-DproxyHost=proxy.hogehoge.co.jp

-DproxyPort=8080

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 40

Groovyの便利な機能

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 41

セーフナビゲーション

• ピリオドで繋いでフィールドやプロパティ、メソッド呼び出しを連ねていくとき: a.b.c()

• フィールドやプロパティの値、メソッド呼び出しの結果がnullである場合を考慮すると以下のようになる。 if (a != null && a.b != null) {

a.b.c() }

• ピリオド(.)の代わりに?.を使用すると、各参照がnullのときは式全体の値がnullになる(NullPointerExceptionが発生しない)。 a?.b?.c()

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 42

Groovyの真偽値型

•boolean型以外でも真偽値判定に使用できる

if ("ABC") { … }

•そのとき、以下の値が偽と判定される

null, 0, "", [], [:], …

参考: プログラミングGroovy p61

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 43

assert

• Groovyのassert文には以下の特長がある

–常に有効である

↔Javaの場合、-eaオプションを指定しないと有効にならない

– assert失敗時のメッセージがとても親切である。

テストでは積極的に使うべき

| Failure: testSomething(test.TestTests)

| Assertion failed:

assert user.save() != null

| | |

| null false

test20120412.User : null

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 44

Groovyでの「長さ」取得

型 Javaでの取得方法 Groovyでの取得方法

配列 length フィールド size() メソッド

String length() メソッド size() メソッド

StringBuilder length() メソッド size() メソッド

StringBuffer length() メソッド size() メソッド

Collection size() メソッド size() メソッド

Map size() メソッド size() メソッド

File length() メソッド size() メソッド

Matcher groupCount() メソッド size() メソッド

size()さえ覚えておけば良い!

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 45

Groovyの注意点

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 46

Groovyの注意点(1)

•変数は宣言する必要がある

a = 3 // ×

int a = 3 // ○

def a = 3 // ○

「スクリプト」におけるバインディング変数の場合は例外。「プログラミングGroovy」p45バインディング変数 参照

Object a = 3と同様

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 47

Groovyの注意点(2)

•型チェックは実行時に行なわれる

String s = 3 // 実行時にキャスト例外

–このコードは実行しないとエラーにならない。(このコードを含むメソッドが呼び出されない限りエラーにならない)

–Javaで例えると以下のようなイメージ

Object tmp = new Integer(3)

String s = (String)tmp

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 48

Groovyの注意点(3)

• 変数や関数の戻り値・引数の型指定はした方が良い? def foo(a,b,c) String bar(String a, List b, Map c)

型指定の利点: IDEでの補完、実行時型チェック、ドキュメントの役に立つ

• 一概には言えないが、業務開発では型指定をすべきでないケースを除いて基本的に指定した方が良い – 型指定することで柔軟性が損なわれる場合は型指定しない – Grailsのドメインクラスではフィールドの型指定が必須 – プリミティブ型の配列では型指定が必須

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 49

Groovyの注意点(4)

•Groovyにおける同値判定

値の比較 インスタンスが同じかどうか

Groovy == (もしくはequals()でも良い。==はequalsの別名)

Object#is()

Java equals() ==

Groovyでは文字列比較に==を使える

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 50

Groovy演習

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 51

準備:Eclipse/GGTSの設定

•行番号の表示 –[window]-[設定]-[一般]-[エディター]-[テキスト・エディター]の[行番号の表示]

•空白文字の表示(お好みで) –同、[空白文字の表示]

•保存時にセミコロンを除去(お好みで) –[window]-[設定]-[Groovy]-[Formatter]-

[remove unneccessary semicolons]

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved.

文字コードの設定

• Windowsではtext file encoding UTF-8に設定 (Windows上のEcipseの デフォルトがMS932なので)

52

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 53

Groovy演習の説明(1)

• Groovy_Operation

プロジェクトをGGTSに

インポートする – [ファイル]-[インポート]-

[Git/Project From Git]-[Clone URL]

– 以下を入力 • https://github.com/ueh

aj/groovy-bootcamp2015

– Master/answerの両方をチェック

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 54

Groovy演習の説明(2)

課題:未完成の本体クラスと、それらに対応するテストクラスを所与とする。これらのテストコードがすべてパスするように本体クラスを完成せよ。

本体クラス テストクラス

未完成なのでこれらを修正して完成させる。 これらは修正しないこと。

Groovy_Operation

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 55

Groovy演習の説明(3)

• Package Explorerからsrc/test(もしくは個々のテストクラス・テストメソッド)を選択し、右クリック-[Run As]-[JUnit Test]

この状態にすれば完了。

※「テストクラスが見つからない」エラーになる場合はクリーンして再ビルド。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 56

Groovy演習の説明(4)

本体クラス(StringOperation)

@Test

void "文字列の長さを取得する"() {

assert cut.method2("abcdef") == 6

assert cut.method2("") == 0

}

/**

* 引数に与えた文字列strの長さを返す。

*/

def method2(String str) {

// TBD

}

テストクラス(StringOperationTest)

このテストが合格するように・・・ (assertの式がtrueになるように…)

この本体メソッドを実装する(課題)

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 57

Groovy演習の説明(5)

• String操作(StringOperation)

• Closure操作(ClosureOperation)

• List操作(ListOperation)

• Map操作(MapOperation)

• Collection操作(CollectionOperation)

• その他(OtherOperation)

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 58

演習について

• わからなければanswerブランチの回答を見て進めて下さい。 – src/main配下のGroovyファイルで、右クリック、

[compareWith]-[Branch, tag or..]-[Remote Tracking]-[origin/answer]

• 書籍「プログラミングGroovy」およびGDKリファレンスも参照して進めて下さい。 – http://groovy.codehaus.org/groovy-jdk/

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 59

Groovyの文字列操作

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 60

GString

•ダブルクォートで括られた文字列中で、$変数名、${式}の記法は変数や式の値に置換される。

a = "ABC"

c = 7

"$a$c${c*2}" == "ABC714"

参考: プログラミングGroovy p67

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 61

Groovyの文字列定数

記法 複数行可能か? 文字'¥'の扱い $,${}の展開(GString)

”ABCDE” 単一行 エスケープ文字 行う

’ABCDE’ 単一行 エスケープ文字 行わない

/ABCDE/ 単一行 エスケープ文字として扱わない

行う

””” ABCE

EFG ”””

複数行 エスケープ文字 行う

’’’ ABCD

EFG ’’’

複数行 エスケープ文字 行わない

$/ABCE

EFG/$

複数行 エスケープ文字として扱わない

行う

Groovyに「文字型定数」はない。使うとしたら ’a’ as char や (char)’a’ のように文字列から強制変換を行う。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 62

演習: String操作(StringOperation)

• StringOperationクラスのメソッドを定義し、StringOperationTestのテストメソッドがすべてPASSするようにせよ。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 63

クロージャ

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 64

クロージャとは

• コンテキストを持ったコードブロック(コード断片)

• Javaの「無名内部クラス」に近い機能 –無名内部クラス

Runnable r = new Runnable(){

public void run() {

System.out.println("hello");

}

};

– Groovyのクロージャ Closure c = { println "hello" }

• eachやcollectなど、「クロージャを引数に取るメソッド」があり、柔軟な処理が可能。

但し、Javaの内部クラスにおける「非finalな

ローカル変数にはアクセスできない」という制約は無いので、より高機能である

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 65

クロージャの定義と呼び出し

• クロージャリテラル { .. } をコード中に書くことでクロージャが生成される。書いただけでは実行されない(遅延評価) c = { println ”ABC” }

• .call()したときに実行される c = {println ”ABC” } c.call()

• .call()の代りに()でも実行される c = {println ”ABC” } c()

ABC

ABC

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 66

クロージャの引数と返り値

• クロージャは引数をとることができ、先頭で { 引数リスト -> .. }という形で記述する {a,b,c -> println "$a,$b,$c"}.call(1,2,3)

• 引数リストを書かない場合、暗黙引数「it」を1つ取るとみなされる c = { println it } c.call("hello")

• クロージャは値を返す c = { it * 2 } println c.call(3)

1,2,3

hello

6

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 67

演習: クロージャ操作(ClosureOperation)

• ClosureOperationクラスのメソッドを定義し、ClosureOperationTestのテストメソッドがすべてPASSするようにせよ。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 68

Groovyのリスト操作

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 69

リストリテラル

• 角括弧中にカンマ区切りで要素を並べる def a = [1,2,3,”四”]

println a.class

• 空リスト a = [ ]

• as演算子でSetに変換 def s = [1,2,3] as Set

println s.class

class java.util.ArrayList

class java.util.LinkedHashSet

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 70

リストの要素アクセス

a = [1,2,3,4] a.getAt(1) == 2 a[1] == 2 a[-1] == 4 a[2..3] == [3,4] a[3,2,1] == [4,3,2] a[3,1..3] == [4,2,3,4] a[-1..0] == [4,3,2,1]

負の数は末尾からの逆方向インデックス。範囲(1..3)や、カンマで区切った複数インデックスで指定すると、対応する要素群のリストを返す。

a.putAt(1, xxx) a[1] = xxx a[-1] = xxx a[2..3] = xxx a[3,2,1] = xxx

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 71

リストの全要素処理

List lst = [ 'a', 'b', 'c' ]

lst.each{

println it

}

lst.eachWithIndex{ it,idx ->

println "$idx: $it"

}

lst.reverseEach { it ->

println it

}

a b c

0:a 1:b 2:c

c b a

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 72

演習: リスト操作(ListOperation)

• ListOperationクラスのメソッドを定義し、ListOperationTestのテストメソッドがすべてPASSするようにせよ。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 73

Groovyのマップ操作

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 74

マップリテラル

• 中括弧中にカンマ区切りで「キー:値」を並べる def m = [ 'age':35, '名前':"山田太郎" ] println m.getClass()

• キーのクォートは識別子であれば省略できる m = [ age:35, 名前:"山田太郎", '1番好き':"ケーキ" ]

• キーが文字列ではないマップ m = [ 7: "ラッキー", 4: "クッキー", (2+3): "アンラッキー" ]

• 空のマップ

m = [:]

class java.util.LinkedHashMap

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 75

マップの要素アクセス

形式 例 特徴

メソッド形式 map.get(key)

map.put(key,value)

Javaと同じ

配列形式 map['a']

map[key]

キーが変数や式のときシンプル

プロパティ形式 map.a

map."$key"

キーが文字列定数のときシンプル

クォート可能

GStringと併用可

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 76

マップの全要素処理

Map m = [a:1, b:2, c:3] • 1引数クロージャ(エントリが得られる)

m.each { println it.key prntln it.value }

• 2引数クロージャ(key,valueが得られる)

m.each { key, value -> println key

println value }

• エントリの集合 println m.entrySet() • キーの集合 println m.keySet() • 値の集合 println m.values()

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 77

演習: マップ操作(MapOperation)

• MapOperationクラスのメソッドを定義し、MapOperationTestのテストメソッドがすべてPASSするようにせよ。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 78

Groovyのコレクション操作

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 79

主なコレクション操作

• 繰り返し操作 – each/reverseEach

– eachWithIndex

• リスト操作 – reverse

– push/pop

– join

• マップ操作 – each

– entrySet

– keySet/values

• クエリ系 – collect/grep – find/findAll – max/min – any/every

• 集合操作 – contains/in – groupBy – flatten – intersect/disjoint – combinations – transpose

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 80

List#each(Closure)

• クロージャ(ブロック)を引数にとり、クロージャにそれぞれの要素を与えて呼び出す(要素回数だけ繰り返して呼び出す。要素の値がクロージャ引数として与えられる)

クロージャ引数

1 2 3

[1, 2, 3].each { println it }

[1, 2, 3].each { item -> println item } 1

2 3

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 81

List#collect(Closure)

• 引数のクロージャ(ブロック)にそれぞれの要素

を与えて呼び出していく。それぞれの呼び出しの結果をリストとして返す。

[2, 4, 6] [1, 2, 3].collect { it * 2 }

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 82

演習: コレクション操作(CollectionOperation)

• CollectionOperationクラスのメソッドを定義し、CollectionOperationTestのテストメソッドがすべてPASSするようにせよ。

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 83

その他

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 84

暗黙のコンストラクタ

• 明示的にコンストラクタを定義しない場合、

暗黙にMapを引数として取る以下のような

コンストラクタが内部的に生成・利用される。 class Person {

int age

String name

Person(Map m) {

this.age = m.age

this.name = m.name

}

}

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2015 NTT Software Corporation. All rights reserved. 85

名前引数によるメソッド呼び出し

• マップを引数にとるメソッドを呼び出す場合、

「キー:値」の形式で順不同に引数を与えることができる。

def method(Map m) {

assert m.foo == 1

assert m.bar == 2

}

method( foo: 1, bar: 2 )

method( bar: 2, foo: 1 )

NTTソフト道場研修Grails/Groovy入門 Copyright (C) 2013 NTT Software Corporation. All rights reserved. 86

演習: その他の操作(OtherOperation)

• OtherOperationクラスのメソッドを定義し、OtherOperationTestのテストメソッドがすべてPASSするようにせよ。