69
Groovy2.X の新機能 2013/05/11 JJUG CCC 2013 Spring [R2-5] #ccc_r25 JJUG/NTTソフトウェア Grails推進室 上原潤二 13511日土曜日

New features of Groovy 2.0 and 2.1

Embed Size (px)

DESCRIPTION

Session for JJUG Cross Community Conference 2013 Spring. Talks about new feature of Groovy 2.0 and 2.1.

Citation preview

Page 1: New features of Groovy 2.0 and 2.1

Groovy2.Xの新機能

2013/05/11 JJUG CCC 2013 Spring [R2-5] #ccc_r25

JJUG/NTTソフトウェア Grails推進室 上原潤二

13年5月11日土曜日

Page 2: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

自己紹介上原潤二(@uehaj)NTTソフトウェア株式会社Grails推進室JGGUG(日本Grails/Groovyユーザグループ)運営委員書籍執筆: プログラミングGROOVY(技術評論社), Grails徹底入門(翔泳社)ブログ「Grな日々」GroovyServ, Staticalizer, LispBuilder, GVM開発者

13年5月11日土曜日

Page 3: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Groovyって何?Java仮想マシン上で動作する動的言語Javaとほぼ上位互換文法、冗長部分を省略でき、簡潔に書ける(一説によると記述量1/4~1/10)既存のJavaコードやライブラリをそのまま利用可能「RubyっぽいJava」

3

拡張性が高く、内部DSLとして用いることができ、ツール群・フーレームワーク群からなるエコシスムを構成

13年5月11日土曜日

Page 4: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Groovyって何?Java仮想マシン上で動作する動的言語Javaとほぼ上位互換文法、冗長部分を省略でき、簡潔に書ける(一説によると記述量1/4~1/10)既存のJavaコードやライブラリをそのまま利用可能「RubyっぽいJava」

3

拡張性が高く、内部DSLとして用いることができ、ツール群・フーレームワーク群からなるエコシスムを構成

(動|静)的言語

13年5月11日土曜日

Page 5: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Groovyエコシステム

4

Ratpack

Groovy++

SpockGORM

GExcelAPI

SwingBuilderMarkupBuilder

AntBuilder

JsonBuilder

Graffiti

GroovyEclipse/GGTS

Geb

GroovyFX

gbench/gprof

vert.x

GContractsGVM Tool

13年5月11日土曜日

Page 6: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Groovyエコシステム

4

Ratpack

Groovy++

SpockGORM

GExcelAPI

SwingBuilderMarkupBuilder

AntBuilder

JsonBuilder

Graffiti

GroovyEclipse/GGTS

Geb

GroovyFX

gbench/gprof

vert.x

GContractsGVM Tool

13年5月11日土曜日

Page 7: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Groovyエコシステム

4

Ratpack

Groovy++

SpockGORM

GExcelAPI

SwingBuilderMarkupBuilder

AntBuilder

JsonBuilder

Graffiti

GroovyEclipse/GGTS

Geb

GroovyFX

gbench/gprof

vert.x

JGGUG G*Workshopでハンズオン実施予定

(5/17)

Androidアプリの公式ビルドシステム

GContractsGVM Tool

13年5月11日土曜日

Page 8: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Groovyの歴史を簡単に

5

年 リリース トピックス2003 Groovy 開発開始2004 Groovy 1.0-jsr-01 JSR 2412007 Groovy 1.02007 Groovy 1.5(=1.1) Java5対応2009 Groovy 1.6 AST変換導入2009 Groovy 1.72011 Groovy 1.82012 Groovy 2.0(=1.9) Java SE 7対応2013/1 Groovy 2.1.0

13年5月11日土曜日

Page 9: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

AST変換強化

ライブラリ強化

Java SE 7対応

静的Groovy

Groovy 2.0の新機能 その他

NotYetImplemented

TypeChecked, CompileStatic

モジュール化

静的型チェック静的コンパイル

6

Project Coin対応

indy対応

二進リテラル

マルチキャッチ

リテラル中の下線Collection.inject()

Matcher.matchesPartially()

takeWhile/dropWhileCalendar.next/PreviouswithDefault/withEagar…

13年5月11日土曜日

Page 10: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

AST変換強化

コンパイラ設定(CompilerConfiguration)

Java SE 7対応

静的Groovy

Groovy 2.1の新機能 その他

CompileDynamic

GPars 1.0へのアップグレード

@DelegatesTo

型チェッカの拡張

indyフル対応

スクリプト基底クラスの指定

コンパイラ設定スクリプト・ビルダ

メタアノテーション

コマンドラインからjar://, file:// URLを実行

13年5月11日土曜日

Page 11: New features of Groovy 2.0 and 2.1

静的Groovysince 2.0

13年5月11日土曜日

Page 12: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

静的型チェック/静的コンパイル@TypeChecked: 静的型チェック➡型を確定することでわかるエラーをコンパイル時にチェック

@CompileStatic: 静的コンパイル➡静的型チェックに加え、型が静的に定まっていることを前提としたコードを生成(javacが生成するものに近い)➡目的は性能向上AST変換アノテーションとして実装されている

これらのアノテーションをクラスやメソッドに指定すると、その範囲のメソッド内のコードが対象となる9

この2者を総称したものがGroovy2での「静的Groovy」

13年5月11日土曜日

Page 13: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

「静的Groovy」で何がどう変わるの?

変数・メソッド引数等に型宣言が必要となる(その結果キャスト等が必要になる場合がある)ただし型推論により型宣言は省略できる場合があるgenericsなどにも対応しておりかなり賢い

動的機能については対応不可EMC,カテゴリ,インターセプタ等による動的メソッドやプロパティ参照、マップ要素のプロパティ参照など明示的なgetPropertyやinvokeMethodの呼び出しで対応する…可読性が顕著に低下もしくはアノテーション指定でメソッド個別にスキッ10

13年5月11日土曜日

Page 14: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

静的型チェックにより検出されるエラー例

11

import  groovy.transform.TypeChecked

@TypeCheckedint  foo(String  s)  {    int  i  =  s    //  [Static  type  checking]  -­‐  Cannot  assign  value  of  type  java.lang.String  to  variable  of  type  int    String  result  =  s.toUppperCase()    //  [Static  type  checking]  -­‐  Cannot  find  matching  method  java.lang.String#toUppperCase().  Please  check  if  the  declared  type  is  right  and  if  the  method  exists.    return  result    //  [Static  type  checking]  -­‐  Cannot  return  value  of  type  java.lang.String  on  method  returning  type  int}

型が違う!

そんなメソッド無い!

型が違う!

13年5月11日土曜日

Page 15: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

静的型のメリット・デメリット静的型のメリット:1.静的型情報に基づいた最適化による性能向上➡静的コンパイル

2.コンパイル時型チェックによる信頼性向上➡静的型チェック

3.作業効率向上(IDEによる入力補完機能、タイプミス早期検出)➡静的型チェック

4.ドキュメンテーションとしての型情報による保守性向上➡オプショナルタイピング(既存機能)デメリット: 面倒臭い、動的機能が利用できない

12

総合的にいって本当に向上するかは議論がある

13年5月11日土曜日

Page 16: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

例:動的Groovy(従来)

13

def  calc(basePrice,  passengers)  {    def  map  =  [An:{it},                          Ap:{0},                          Aw:{half(map.An(it))},                          Cn:{half(map.An(it))},                          Cp:{0},                          Cw:{half(map.Cn(it))},                          In:{half(map.An(it))},                          Ip:{0},                          Iw:{half(map.In(it))}]    def  groups  =  passengers          .collect{[it,  map[it](basePrice)]}              .groupBy{it[0][0]}.withDefault{[]}    return  (groups.A+groups.C+groups.I.sort{it[1]}                    .take(groups.I.size()-­‐(groups.A.size()*2)))                        .sum{it[1]}}

「第9回オフラインリアルタイムどう書く」の問題(バス代の計算)よりhttp://nabetani.sakura.ne.jp/hena/ord9busfare/

13年5月11日土曜日

Page 17: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

例:静的Groovy

14

@CompileStaticint  calc(int  basePrice,  List<String>  passengers)  {    Map<String,Closure>  map    map  =  [An:{int  it-­‐>it},                  Ap:{int  it-­‐>0},                  Aw:{int  it-­‐>half((int)map.get('An')(it))},                  Cn:{int  it-­‐>half((int)map.get('An')(it))},                  Cp:{int  it-­‐>0},                  Cw:{int  it-­‐>half((int)map.get('Cn')(it))},                  In:{int  it-­‐>half((int)map.get('An')(it))},                  Ip:{int  it-­‐>0},                  Iw:{int  it-­‐>half((int)map.get('In')(it))}]    Map<String,List>  groups  =  passengers.collect{String  it-­‐>[it,  map.get(it)(basePrice)]}.groupBy{List<String>  it  -­‐>it[0][0]}.withDefault{[]}    return  ((groups.get('A')+groups.get('C')+groups.get('I').sort{                        List<Integer>  it  -­‐>  it[1]                      }.take(groups.get('I').size()-­‐(groups.get('A').size()*2))).sum{List<Integer>  it  -­‐>  it[1]})  as  Integer}

メソッドの引数や戻り値の型指定、型キャスト、マップのプロパティ記法アクセス、クロージャの暗黙引数の指定の明示化、などの追記必要

13年5月11日土曜日

Page 18: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

例:Java8 Lambda版(おまけ)

15

   int  calc(int  basePrice,  List<String>  passengers)  {        Map<String,Function<Integer,Integer>>  map  =  new  HashMap<>();        map.put("An",(Integer  it)-­‐>  it);        map.put("Ap",(Integer  it)-­‐>  0);        map.put("Aw",(Integer  it)-­‐>half(map.get("An").apply(it)));        map.put("Cn",(Integer  it)-­‐>half(map.get("An").apply(it)));        map.put("Cp",(Integer  it)-­‐>0);        map.put("Cw",(Integer  it)-­‐>half(map.get("Cn").apply(it)));        map.put("In",(Integer  it)-­‐>half(map.get("An").apply(it)));        map.put("Ip",(Integer  it)-­‐>0);        map.put("Iw",(Integer  it)-­‐>half(map.get("In").apply(it)));        Map<String,List<List>>  groups  =passengers.stream()            .map(it  -­‐>  Arrays.asList(it,  map.get(it).apply(basePrice)))            .collect(Collectors.groupingBy(it  -­‐>  (((String)it.get(0)).substring(0,1))));        List<List>  tmp  =  new  ArrayList(groups.get("A"));        tmp.addAll(groups.get("C"));        long  size  =  (long)(groups.get("I").size()-­‐groups.get("A").size()*2);        groups.get("I").sort((a,  b)-­‐>(Integer)(a.get(1))-­‐(Integer)(b.get(1)));        tmp.addAll(groups.get("I").stream().limit(size).collect(Collectors.toList()));        return  tmp.stream().mapToInt(it-­‐>(Integer)it.get(1)).sum();    }

13年5月11日土曜日

Page 19: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

速度・コード量比較

16

所要時間(ms) コード量(bytes)Java 8 648 3847静的Groovy 1135 2234動的Groovy 1532 1613

0" 1000" 2000" 3000" 4000" 5000"

��Groovy"

��Groovy"

Java"8"

��(bytes)"

����(ms)"

動的Groovyを最大限活かしたコードを移植したものであり、フェアな比較ではないかもしれない。あくまで参考として。

13年5月11日土曜日

Page 20: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

余談: Java8 Lambda式とGroovy’s Closureいずれも実体は別オブジェクトのメソッド

17

Groovy’s Closure Java 8’s Lambda表記 {arg -> body }

{body it}(arg) -> {body}arg -> body

ローカル変数や引数のキャプチャ

リファレンス経由で変更可能

実質的final限定

コレクションAPIへのクロージャ操作の追加

GDKで既存JDK APIを拡張

デフォルト実装 or Stream経由

動的に設定可能な“this”

delegateプロパティ

13年5月11日土曜日

Page 21: New features of Groovy 2.0 and 2.1

indy対応since 2.0~2.1

13年5月11日土曜日

Page 22: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

indyとその利用方法

groovy/groovycコマンドから使う<GROOVY_HOME>/lib,embeddeable/配下の、-indy接尾辞のついたjarファイルを-indyなしにリネームgroovyコマンド、もしくはgroovycコマンドで--indyを指定

gradle(1.1以降)から使う

19

dependencies  {        groovy  group:  'org.codehaus.groovy',  name:  'groovy-­‐all',  version:'2.0.1',  classifier:'indy'}compileGroovy  {        groovyOptions.optimizationOptions.indy=true}

indy…Java VM上での動的言語実行の効率化を目的とした機能拡張(JSR292)の通称。Java SE 7(JDK)から利用可

13年5月11日土曜日

Page 23: New features of Groovy 2.0 and 2.1

モジュール化since 2.0

13年5月11日土曜日

Page 24: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

モジュール化(1)

groovy-1.8.2.jar…5,529,556バイトgroovy-2.0.1.jar…3,270,730バイト➡切り出されたもの: groovy-ant, groovy-bsf, groovy-console, groovy-docgenerator,

groovy-groovydoc, groovy-groovysh, groovy-jmx, groovy-json, groovy-jsr223, groovy-servlet, groovy-sql, groovy-swing, groovy-templates, groovy-test, groovy-testng, groovy-xml

利用者(Groovyプログラマ)にはあまり影響ないmaven pomモジュールとしても分割されている依存性がきっちり定義されている

21

groovy-X.X.X.jarを「拡張モジュール」の集合として再構成

しゅりんく!

13年5月11日土曜日

Page 25: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

モジュール化(2)拡張モジュールは「カスタム拡張メソッド」を提供できるGDKメソッドのように既存クラスにメソッドを追加するカテゴリとは異なり、静的Groovy配下でも利用可能@Grabで取り込んだ場合でもカスタム拡張メソッドは有効。

拡張モジュールは誰でも作れ、実体は以下のような内容の「org.codehaus.groovy.runtime.ExtensionModule」ファイルをMETA-INF/services directoryに含めたJarファイル

22

moduleName=groovy-­‐streammoduleVersion=0.5.1extensionClasses=groovy.stream.StreamExtensionstaticExtensionClasses=

13年5月11日土曜日

Page 26: New features of Groovy 2.0 and 2.1

@DelegatesToアノテーション

since 2.1.0

13年5月11日土曜日

Page 27: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

@DelegatesToアノテーションメソッド宣言におけるメソッド引数(クロージャ)に指定def foo(@DelegatesTo(<Class>) Closure c) { …}

24

このメソッドの引数に渡したクロージャが呼び出されるときにはdelegateプロパティ(動的なthis)に@DelegatesToに指定した型<Class>のインスタンスが代入されているということを、呼び出し側が判るように宣言する。

13年5月11日土曜日

Page 28: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

何ができるのか?delegateを用いて実装されたビルダーやDSLの静的型チェック、IDEでの補完が簡単にできる。「型チェッカの拡張」よりも簡単制約は比較的大きい。

2513年5月11日土曜日

Page 29: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

つまりこういうこと(1)def foo(Closure c) { …}

foo {

toUpperCase() // String#toUpperCase()が呼び出される}

2613年5月11日土曜日

Page 30: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

つまりこういうこと(2) def foo(@DelegatesTo(String) Closure c) { … }@TypeChecked // 静的型チェックのもとでfoo { // このクロージャ内では、delegateプロパティは // Stringインスタンスを保持していると仮定できる toUpperCase()}

27

静的型チェックもしくは静的コンパイルできる。(DelegatesToが無ければ静的型チェックエラー)

13年5月11日土曜日

Page 31: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

つまりこういうこと(3)def foo(@DelegatesTo(String) Closure c) { …}@TypeCheckedfoo { // delegateはStringインスタンスを保持 // していると仮定できる toooUpperCase()}

28

コンパイル時エラーになる

13年5月11日土曜日

Page 32: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

やってみた: 静的HTMLビルダ静的型チェック可能なMarkupBuilderモドキ

29

@TypeCheckeddef  test()  {    new  HtmlBuilder().html  {        head  {            title  "Groovy  2.1.0は凄い!"        }        body  {            p  "Groovy  2.1.0は凄い!"            ul  {                li  "リスト1"                ul  "リスト2"  //[Static  type  checking]  -­‐  Cannot  find  matching  method  a#ul(java.lang.String).            }            h1  "凄いわ!"        }    }}

https://gist.github.com/uehaj/4563201

13年5月11日土曜日

Page 33: New features of Groovy 2.0 and 2.1

型チェックの拡張since 2.1.0

13年5月11日土曜日

Page 34: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

型チェックの拡張とはGroovyコンパイラに介入し、コンパイル時型チェックを自分でカスタマイズ・拡張できる実は型チェックに限らずなんでもできるAST変換の応用例の1つ。Groovyコンパイラのオープン化の一環。@TypeChecked(extensions=”「型チェッカビルダ」で記述されるスクリプトを指定”)

3113年5月11日土曜日

Page 35: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

型検査拡張でできること

32

コンパイル時チェックできるかも!Grailsのdynamic finderをDBスキーマを参照しチェックメソッドが存在しない場合、GroovyのモジュールをGrapeで追加ダウンロードしてメソッド追加呼び出そうとするメソッドが静的に存在しない場合、invokeMethod()を呼び出す(Groovy++のmixedモードコンパイル相当)sprintf()のフォーマットと引数型のチェック静的解析任意のチェッカ(コーディング規約チェックとか)文字列定数内のコードを、そのスコープで型チェックする:

13年5月11日土曜日

Page 36: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

やってみた: 静的チェッカ

33

//  staticCheck.groovy、チェッカコードbeforeVisitMethod  {  methodNode  -­‐>    if  (methodNode.name.startsWith("is")  &&        methodNode.returnType  !=  classNodeFor(Boolean)  &&        methodNode.returnType  !=  classNodeFor(boolean))  {        addStaticTypeError("name  starts  'is'  but  not  boolean",  methodNode)    }    else  if  (methodNode.name[0]  =~  /[A-­‐Z]/){        addStaticTypeError("Method  name  started  with  upper  case  character.",  methodNode)    }}

//  チェック対象コード@TypeChecked(extensions="./staticCheck.groovy")class  StaticCheckTest  {    String  isTest(x)  {}  //  [STC]-­‐name  starts  'is'  but  not  boolean    void  Method()  {}  //  [STC] - Method name started with upper case character.}

13年5月11日土曜日

Page 37: New features of Groovy 2.0 and 2.1

メタアノテーションsince 2.1.0

13年5月11日土曜日

Page 38: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

メタアノテーションとは複数のアノテーションを結合したアノテーションを定義する引数を与えたアノテーションに別名をつける上記により定義されるアノテーションのセマンティクスを定義するGroovyのアノテーションやAST変換はもとより、Javaのアノテーションを処理することもできる。AST変換としてコンパイル時に変形している。

13年5月11日土曜日

Page 39: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

やってみたimport  groovy.transform.AnnotationCollectorimport  org.junit.Afterimport  org.junit.Before

@Before@After@AnnotationCollector@interface  BeforeAndAfter  {}

class  ArithmeticTest  {    //  JUnitのテスト定義  @BeforeAndAfter  void  foo()  {        println  "setUpとtearDownの両方で実行される"  }

}

@Beforeと@Afterを結合して新たなアノテーション

@BeforeAndAfterを作る

13年5月11日土曜日

Page 40: New features of Groovy 2.0 and 2.1

ライブラリの強化(時間が余れば)

since 2.0

13年5月11日土曜日

Page 41: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 42: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 43: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 44: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 45: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 46: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 47: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 48: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

injectのおさらい

38

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式} →  <結果>

[e1,e2,e3,e4,e5].inject(ini){acc,val-­‐>式}  →  <結果>

ini e1, e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject(0){a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 49: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

初期値無しinject

39

e1

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式}

{acc,val-­‐>式} →  <結果>

[e1,e2,e3,e4,e5].inject{acc,val-­‐>式}  →  <結果>

e2, e3, e4, e5 ][

assert  [1,2,3,4,5].inject{a,b  -­‐>  a+b}  ==  1513年5月11日土曜日

Page 50: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

Matcher#matchesPartially()

40

(x=~p).matchesPartially()の結果

➡インタラクティブなバリデーションなどに使用可能

assert  ("1"          =~  /\d\d\d/).matchesPartially()assert  ("12"        =~  /\d\d\d/).matchesPartially()assert  ("123"      =~  /\d\d\d/).matchesPartially()assert  !("12a"    =~  /\d\d\d/).matchesPartially()assert  !("1234"  =~  /\d\d\d/).matchesPartially()

true …文字列xの末尾になんらかの文字列を追加したものは、 パターンpにマッチする可能性がある

false …文字列xの末尾にどんな文字列を追加しても、 パターンpにマッチすることは有り得ない

13年5月11日土曜日

Page 51: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

41

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

13年5月11日土曜日

Page 52: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

41

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

13年5月11日土曜日

Page 53: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

41

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

13年5月11日土曜日

Page 54: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

41

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

e3

13年5月11日土曜日

Page 55: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

41

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e3,

{it-­‐>式}がtrue

e3

13年5月11日土曜日

Page 56: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).takeWhile{}

41

[e1,e2,e3,e4,e5].takeWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が真である要素のみからなる先頭部分を返す。

assert  [1,2,3,4,3].takeWhile{it<=3}  ==  [1,2,3]

e5

{it-­‐>式}がtrue

[ ]

][

e1,

e1,

{it-­‐>式}がtrue

e2,

e2,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e3,

{it-­‐>式}がtrue

e3

13年5月11日土曜日

Page 57: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

42

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

13年5月11日土曜日

Page 58: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

42

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

13年5月11日土曜日

Page 59: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

42

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

13年5月11日土曜日

Page 60: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

42

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

13年5月11日土曜日

Page 61: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

42

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e4,

13年5月11日土曜日

Page 62: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

(List,CharSequence,Map,T[]).dropWhile{}

42

[e1,e2,e3,e4,e5].dropWhile{it-­‐>式}  →  <結果>

リストの要素を順にたどり、クロージャを適用した結果が偽である初めての要素以降を返す。

assert  [1,2,3,4,3].dropWhile{it<=3}  ==  [4,5]

[ ]

][

e1,

{it-­‐>式}がtrue

e2,

{it-­‐>式}がtrue

e3,

{it-­‐>式}がtrue

e4,

{it-­‐>式}がfalse

e4,

e5

{it-­‐>式}がtrue

e5

13年5月11日土曜日

Page 63: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.43

まとめhttp://www.flickr.com/photos/limonada/214375219/

13年5月11日土曜日

Page 64: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

まとめ

4413年5月11日土曜日

Page 65: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

まとめGroovy 2.0 … 「静的への回帰」「Better Java」としてのGroovy「今使えるJava 8」Project Lambda, TypeAnnotation(的な)

4413年5月11日土曜日

Page 66: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

まとめGroovy 2.0 … 「静的への回帰」「Better Java」としてのGroovy「今使えるJava 8」Project Lambda, TypeAnnotation(的な)

44

Groovy 2.1…「動的と静的の融合」ビルダ、DSLなどの動的コードを静的チェック・補完DSL(フレームワーク、ツール)への適用Gradle,Spockは今のところ静観(?)

13年5月11日土曜日

Page 67: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

G*Magazine記事もどうぞG*Magazine Vol.6Groovy臨機応変(第一回)動中の静…Groovy 2.1.0の新機能その1

45

http://grails.jp/g_mag_jp/file/gmagazine_6.pdf

13年5月11日土曜日

Page 68: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

宣伝: JGGUG G*Workshop Z: Spockハンズオン

2013年05月17日(金) (来週の金曜日)9時00分 - 21時00分http://jggug.doorkeeper.jp/events/3872

Spock: Groovyを使用するBDDテスティングフレームワークSpockJava開発にも使用でき、可読性の高いテストコードを記述できる、高機能なテスティングフレームワークハンズオン: Spockの基本, データ駆動テスト, モックサポート, 機能拡張,(カスタム機能拡張,Grails連携,その他アドバンストピック)

4613年5月11日土曜日

Page 69: New features of Groovy 2.0 and 2.1

Slide # JGGUG G*Workshop Copyright(C) 2013 NTT Software Corporation All rights reserved.

参考URL・商標http://groovy.codehaus.org/Groovy+2.0+release+noteshttp://groovy.codehaus.org/Groovy+2.1+release+notes?nchttp://www.slideshare.net/glaforge/groovy-20-devoxx-france-2012http://www.infoq.com/jp/articles/new-groovy-20http://www.jroller.com/melix/entry/groovy_2_0_from_anhttp://docs.codehaus.org/display/GROOVY/Creating+an+extension+modulehttp://d.hatena.ne.jp/ksky/20100513/p1http://docs.codehaus.org/display/GroovyJSR/GEP+11+-+Groovy+3+semantics+and+new+MOPhttp://glaforge.appspot.com/article/minor-new-features-of-groovy-2-0http://glaforge.appspot.com/article/incomplete-string-regex-matchinghttp://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdfhttp://melix.github.com/talks/s2gx-typechecking/slides.htmlhttp://m.infoworld.com/d/application-development/groovy-the-roadmap-the-popular-jvm-language-202990?page=0,1OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です

4713年5月11日土曜日