G* Workshop in fukuoka 20120901

2,620 views
2,537 views

Published on

About new features of Groovy 2.0

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,620
On SlideShare
0
From Embeds
0
Number of Embeds
597
Actions
Shares
0
Downloads
9
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide
  • \n
  • Grな日々、2007年から執筆しています。\n日本初のオリジナル書籍プログラミングGroovyを執筆しました。\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • これらが効くのはaがローカル変数だからであり、あるいはメソッド引数の場合だけであり、クラスのフィールドではエラーとなる。\n
  • これらが効くのはaがローカル変数だからであり、あるいはメソッド引数の場合だけであり、クラスのフィールドではエラーとなる。\n
  • これらが効くのはaがローカル変数だからであり、あるいはメソッド引数の場合だけであり、クラスのフィールドではエラーとなる。\n
  • これらが効くのはaがローカル変数だからであり、あるいはメソッド引数の場合だけであり、クラスのフィールドではエラーとなる。\n
  • \n
  • \n
  • \n
  • 「高機能なJava」「簡潔なJava」「コンパイル不要Java」としてGroovyを使う人も少なからずいる\n\n
  • Javaのように面倒になる。\n
  • \n
  • \n
  • Groovy++はmixedモードコンパイル、traitsなどGroovy 2.x系にとりこまれなかった先進的な機能を持っていたが、開発は停止している。\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 「何割削減」とかではなく、特定部分を「ゼロ」にする\n\n
  • \n
  • G* Workshop in fukuoka 20120901

    1. 1. Groovy2.0 の新機能 静かなること 静的型のごとし 2012/9/1 JGGUG G*Workshop in 福岡 NTTソフトウェア Grails推進室 上原潤二http://www.flickr.com/photos/cedric_foll/1103944944/
    2. 2. 自己紹介上原潤二(@uehaj) NTTソフトウェア株式会社Grails推進室JGGUG(日本Grails/Groovyユーザグループ)運営委員書籍執筆: プログラミングGROOVY(技術評論社), Grails徹底入門(翔泳社) ブログ「Grな日々」 GroovyServ, LispBuilder, GVM開発者Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    3. 3. お品書き Groovyの歴史を簡単に Groovy1.8の新機能(おさらい) Groovy2.0の新機能 静的Groovy indy対応 ライブラリ強化 モジュール化 まとめ Groovy 3.XSlide # 3 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    4. 4. Groovyの歴史を簡単に 年 リリース トピックス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対応 Slide # 4 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    5. 5. クロージャ周り強化 AST変換強化 アノテーションのクロージャ引数 多数のAST変換追加 クロージャ合成 ASTブラウザの強化 トランポリン メモ化 Groovy 1.8 ASTメタデータ の新機能 部分適用(curry)の拡張効率向上 その他 実行可能jarによるプリミティブ演算最適化 スクリプト実行、 Grab改良、メソッドの直接呼び出し ライブラリ強化 GroovyDocカスタマ イズ、モジュール化 文法の拡張 GDK・Groovy APIメソッドの追加 GParsの標準添付 拡張コマンド式(GEP3) GSqlのページング $/ドルスラッシュ文字列リテラル/$ スラッシュ文字列リテラルの複数行対応 Slide # 5 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    6. 6. 静的Grovy AST変換強化 Groovy 2.0Java SE 7対応 の新機能 その他 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    7. 7. 静的Grovy AST変換強化 静的型チェック 静的コンパイル Groovy 2.0Java SE 7対応 の新機能 その他 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    8. 8. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStaticJava SE 7対応 の新機能 その他 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    9. 9. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStaticJava SE 7対応 の新機能 その他 モジュール化 ライブラリ強化 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    10. 10. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStaticJava SE 7対応 の新機能 その他Project Coin対応 モジュール化 二進リテラル ライブラリ強化 リテラル中の下線 マルチキャッチ indy対応 Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    11. 11. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStaticJava SE 7対応 の新機能 その他Project Coin対応 モジュール化 二進リテラル ライブラリ強化 リテラル中の下線 マルチキャッチ Collection.inject() Matcher.matchesPartially() takeWhile/dropWhile indy対応 Calendar.next/Previous withDefault/withEagar … Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    12. 12. 静的Grovy AST変換強化 静的型チェック NotYetImplemented 静的コンパイル Groovy 2.0 TypeChecked, CompileStaticJava SE 7対応 の新機能 その他Project Coin対応 モジュール化 二進リテラル ライブラリ強化 リテラル中の下線 マルチキャッチ Collection.inject() Matcher.matchesPartially() takeWhile/dropWhile indy対応 Calendar.next/Previous withDefault/withEagar … Slide # 6 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    13. 13. AST変換群 2.0新機能Since Since SinceGroovy 1.6 Groovy 1.8 Groovy 2.0 Bindable ListenerList NotYetImplemented Vetoable AutoClone TypeChecked Category AutoExternalize CompileStatic Delegate Canonical Immutable EqualsAndHashCode Lazy Field Mixin IndexedProperty Newify InheritConstructors Singleton Synchronized PackageScope ConditionalInterrupt ThreadInterruptSince TimedInterruptGroovy 1.7 ToString TupleConstructor Grab power assert WithReadLock / WithWriteLock Commons / Log / Log4j / Slf4j Slide # 7 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    14. 14. 静的Groovyhttp://www.flickr.com/photos/kaeru/501750/
    15. 15. 静的型チェック/静的コンパイル 2.0新機能 @TypeChecked: 静的型チェック ➡型を確定することでわかるエラー この2者を総 をコンパイル時にチェック 称したものが @CompileStatic: 静的コンパイル Groovy2.0で ➡静的型チェックに加え、 の「静的 型が静的に定まっている ことを前提としたコードを生成 ➡目的は性能向上 AST変換アノテーションとして実装されている これらのアノテーションをクラスやメソッドに指定すると、 その範囲のメソッド内のコードが対象となる Slide # 9 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    16. 16. 「静的Groovy」で何がどう変るの? 変数・メソッド引数等に型宣言が必要となる (その結果キャスト等が必要になる場合がある) 要はjavaといっしょだyo!!! ただし型推論により型宣言は省略できる場合がある 変数への代入/初期化の右辺等により型を決める 型推論対象: クロージャから参照されていないローカル変数やメソッド引数 型推論対象外(明示的型指定が必要): フィールドやバインディング変数 クロージャから参照されているローカル変数やメソッド引数 他スレッドによる変数の値変更をコンパイラが把握できない Slide # 10 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    17. 17. 静的型チェックにより検出されるエラー例import groovy.transform.TypeChecked@TypeChecked 型が違う!int foo(String s) { そんなメソッド無い!  int i = s  // [Static type checking] - Cannot assign value of type java.lang.String tovariable of type int  String result = s.toUppperCase()  // [Static type checking] - Cannot find matching methodjava.lang.String#toUppperCase(). Please check if the declared type is right andif the method exists. 型が違う!  return result  // [Static type checking] - Cannot return value of type java.lang.String onmethod returning type int} Slide # 11 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    18. 18. GGTS 3.0.0から利用 Slide # 12 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    19. 19. フローセンシティブタイピングdef a = -3a.abs()a.toUpperCase()a = "ABC"a.abs()a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    20. 20. フローセンシティブタイピング aはint型と見なdef a = -3a.abs()a.toUpperCase()a = "ABC"a.abs()a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    21. 21. フローセンシティブタイピング aはint型と見なdef a = -3a.abs()a.toUpperCase()a = "ABC" aはString型とa.abs()a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    22. 22. フローセンシティブタイピング aはint型と見なdef a = -3 [Static type checking] -a.abs() Cannot find matching method java.lang.Integer#toUpperCasa.toUpperCase() e()a = "ABC" aはString型とa.abs()a.toUpperCase() Slide # 13 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    23. 23. フローセンシティブタイピング aはint型と見なdef a = -3 [Static type checking] -a.abs() Cannot find matching method java.lang.Integer#toUpperCasa.toUpperCase() e()a = "ABC" aはString型とa.abs() [Static type checking] - Cannota.toUpperCase() find matching method Slide # 13 JGGUG G*Workshop java.lang.String#abs() rights reserved. Copyright(C) 2012 NTT Software Corporation All
    24. 24. 静的コンパイル String foo(String s) {     s.toUpperCase() } @CompileStatic String bar(String s) {     s.toUpperCase() } Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    25. 25. 静的コンパイル String foo(String s) {     s.toUpperCase() } public String foo(String s) { CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0]. call(s), java/lang/String); } @CompileStatic String bar(String s) {     s.toUpperCase() } Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    26. 26. 静的コンパイル String foo(String s) {     s.toUpperCase() } public String foo(String s) { CallSite acallsite[] = $getCallSiteArray(); return (String)ScriptBytecodeAdapter.castToType(acallsite[0]. call(s), java/lang/String); } @CompileStatic String bar(String s) {     s.toUpperCase() } public String bar(String s) { return s.toUpperCase(); } Slide # JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    27. 27. ベンチマーク(CompileStatic) 1.2## 1.0## 0.8## CompileStatic 0.6## Groovy#1.8.2# 0.4## Groovy#2.0.1# Groovy#2.0.1#CompileSta<c# 0.2## Java#SE#1.7.0u6# 0.0## ]# # )]# # ]# )]# ]# # ]# # a] f)] g] rt] es y) m ch ry #i f in st c#i so ar or re ku ce na a dR a< rn ck lN [F y#T nn an er ea #te ui ( st ra ar c#t a st [Q hr ct [F ce ib (i n in a< pe [T [F an[B ib ( st [S st [F ib (i n [F ib [F https://github.com/alextkachman/fib-benchmark をベースに計測。 グラフはJavaを1としたときの実行時間の比率(大きいほど速い)。 Slide # 15 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    28. 28. 静的型のメリット・デメリット静的型のメリット: 総合的にいっ1.静的型情報に基づいた最適化による性能向上 て、本当に向上 ➡静的コンパイル するかは議論の2.コンパイル時型チェックによる信頼性向上 ➡静的型チェック3.作業効率向上(IDEによる入力補完機能、タイプミス早期検出) ➡静的型チェック4.ドキュメンテーションとしての型情報による保守性向上 ➡オプショナルタイピング(既存機能)デメリット: 面倒臭い・字数が増える・多態コード・動的機能(EMC,Builderやマルチメソッドなど)が利用できない Slide # 16 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    29. 29. @CompileStatic適用の実際 既存のGroovyコードを静的コンパイルするために必要なの は、@CompileStaticをつけて回るだけの簡単な作業・・・ ではない!(少なくともGroovy 2.0.0では。) 静的コンパイルを通すための修正(例):型宣言を省略していたところを補う(def, 引数, itを型指定して宣言)/Closure#call()の返り値はキャストする/nullを適宜キャストする/引数の動的型に基 いたメソッド選択(マルチメソッド)を使用していた場合、静的に型が確定しているならキャストで。していなけれ ば、Java的にダブルディスパッチで実装しなおす/ダックタイピングは複数メソッドに展開するかinterfaceを導入 ➡規模が大きいと書き換えは相当面倒 以下は対応不可 EMC、カテゴリ、invokeMethod()などによる動的メソッド追加(結果 としてのBuilder周り) アクセス修飾(private,protected,package private)が効いてアクセス 不可➡@CompileStatic(TypeCheckingMode.SKIP)で逃げる Slide # 17 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    30. 30. CompileStaticとアクセス修飾 静的コンパイルで生成されるコードはJavaのアクセス修飾 子による制限に支配される 例えば他クラスのprivateメソッドは呼べない(Javaでは当たり前) ただし、Groovyで定義した(GroovyObjectを継承した)クラスに 対して、フィールドに関してはpublicアクセス可class Target {  private int field  private void method(){}}@groovy.transform.CompileStaticclass StaticCompiledClass {  void foo(Target t) {    t.method()  // Cannot call private method Target#method    "ABC".vaue[0] = "x" // [STC] - No such property: vaue for class: java.lang.String    t.field = 3   // OK  }} Slide # 18 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    31. 31. 余談:Grails 2.2での状況 Grails 2.2ではGroovy 2.Xが採用される予定 Grailsの最新ソースを「CompileStatic」で grepしてみる% grep -r CompileStatic ../grails-bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:importgroovy.transform.CompileStatic./grails-bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:@CompileStatic./grails-bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:@CompileStatic./grails-bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:@CompileStatic./grails-bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:@CompileStatic./grails-bootstrap/src/main/groovy/grails/util/BuildSettings.groovy:@CompileStatic :% grep -r CompileStatic . | wc 124 247 13863 Slide # 19 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    32. 32. Groovy++と静的GroovyGroovy++ Groovy 2.02009∼2011(開発完) 2011∼ コードベースの継続性はない @Typedアノテー @TypeChecked ションによる 静的型チェック 静的Groovy @CompileStatic 静的コンパイル mixedモードコンパイル、 末尾再帰最適化、traits.. などの先進的な機能 対応物は今のところ 無し Slide # 20 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    33. 33. ベンチマーク(vs. Groovy++) 1.2## Grroovy++ 1.0## 0.8## Groovy#1.8.2# 0.6## Groovy#2.0.1# 0.4## Groovy#2.0.1#CompileSta<c# Java#SE#1.7.0u6# 0.2## Groovy#2.0.1#indy# Groovy++0.9.0/1.8.2# 0.0## ]# # )]# )]# ]# )]# ]# # ]# # a] g] rt] es y) m ch ry f #i f in st c#i so ar or re ku ce na a dR a< rn ck lN [F y#T nn an er ea #te ui ( st ra ar c#t a st [Q hr ct [F ce ib (i n in a< pe [T [F an[B ib ( st [S st [F ib (i n [F ib [F Slide # 21 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    34. 34. indy対応http://www.flickr.com/photos/tdar/6330565982/
    35. 35. indyとその利用方法 2.0新機能indy…Java VM上での動的言語実行の効率化を目的とした機能拡張(JSR292)の通称。Java SE 7(JDK)から利用可groovy/groovycコマンドから使う <GROOVY_HOME>/lib,embeddeable/配下の、-indy接尾 辞のついたjarファイルを-indyなしにリネーム groovyコマンド、もしくはgroovycコマンドで--indyを指定gradle(1.1以降)から使う dependencies {     groovy group: org.codehaus.groovy, name: groovy-all, version:2.0.1, classifier:indy } compileGroovy {     groovyOptions.optimizationOptions.indy=true } Slide # 23 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    36. 36. ベンチマーク(indy) 1.2## 1.0## 0.8## 0.6## Groovy#1.8.2# Groovy#2.0.1# 0.4## Groovy#2.0.1#CompileSta<c# Java#SE#1.7.0u6# 0.2## Groovy#2.0.1#indy# 0.0## ]# # )]# )]# ]# )]# ]# # ]# # a] g] rt] es y) m ch ry f #i f in st c#i so ar or re ku ce na a dR a< rn ck lN [F y#T nn an er ea #te ui ( st ra ar c#t a st [Q hr ct [F ce ib (i n in a< pe [T [F an[B ib ( st [S st [F Groovy 2.0.1 -indy ib (i n [F ib [F Slide # 24 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    37. 37. ライブラリ 強化http://www.flickr.com/photos/aloudnoise/5133172272/
    38. 38. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果>assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    39. 39. injectのおさらい[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 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    40. 40. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式}assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    41. 41. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式}assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    42. 42. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式}assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    43. 43. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式}assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    44. 44. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式}assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    45. 45. injectのおさらい[e1,e2,e3,e4,e5].inject(ini){acc,val->式} → <結果> ini [ e1, e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} → <結果 >assert# [1,2,3,4,5].inject(0){a,b 2012 NTT Software Corporation All rights reserved. 26 Slide JGGUG G*Workshop Copyright(C) -> a+b} == 15
    46. 46. 初期値無しinject 2.0新機能[e1,e2,e3,e4,e5].inject{acc,val->式} → <結果> e1 [ e2, e3, e4, e5 ] {acc,val->式} {acc,val->式} {acc,val->式} {acc,val->式} → <結果>assert# [1,2,3,4,5].inject{a,b -> a+b} == 15 All rights reserved. 27 Slide JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation
    47. 47. Matcher#matchesPartially() 2.0新機能(x= p).matchesPartially()の結果 true …文字列xの末尾になんらかの文字列を追加したものは、 パターンpにマッチする可能性がある false …文字列xの末尾にどんな文字列を追加しても、 パターンpにマッチすることは有り得ないassert ("1"     =~ /ddd/).matchesPartially()assert ("12"    =~ /ddd/).matchesPartially()assert ("123"   =~ /ddd/).matchesPartially()assert !("12a"  =~ /ddd/).matchesPartially()assert !("1234" =~ /ddd/).matchesPartially()➡インタラクティブなバリデーションなどに使用可能 Slide # 28 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    48. 48. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機[e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ ][ ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
    49. 49. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機[e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, ] {it->式} がtrue[ e1, ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
    50. 50. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機[e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, ] {it->式} {it->式} がtrue がtrue[ e1, e2, ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
    51. 51. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機[e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, e3, ] {it->式} {it->式} {it->式} がtrue がtrue がtrue[ e1, e2, e3 ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
    52. 52. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機[e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, e3, e4, ] {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse[ e1, e2, e3 ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
    53. 53. (List,CharSequence,Map,T[]).takeWhile{} 2.0新機[e1,e2,e3,e4,e5].takeWhile{it->式} → <結果> [ e1, e2, e3, e4, e5 ] {it->式} {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse がtrue[ e1, e2, e3 ] リストの要素を順にたどり、クロージャを適用した結果が 真である要素のみからなる先頭部分を返す。assert #[1,2,3,4,3].takeWhile{it<=3} Software Corporation All rights reserved. Slide 29 JGGUG G*Workshop Copyright(C) 2012 NTT == [1,2,3]
    54. 54. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機[e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ ] [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
    55. 55. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機[e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, ] {it->式} がtrue [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
    56. 56. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機[e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, ] {it->式} {it->式} がtrue がtrue [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
    57. 57. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機[e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, e3, ] {it->式} {it->式} {it->式} がtrue がtrue がtrue [ ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
    58. 58. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機[e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, e3, e4, ] {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse [ e4, ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
    59. 59. (List,CharSequence,Map,T[]).dropWhile{} 2.0新機[e1,e2,e3,e4,e5].dropWhile{it->式} → <結果> [ e1, e2, e3, e4, e5 ] {it->式} {it->式} {it->式} {it->式} {it->式} がtrue がtrue がtrue がfalse がtrue [ e4, e5 ] リストの要素を順にたどり、クロージャを適用した結果が 偽である初めての要素以降を返す。assert #[1,2,3,4,3].dropWhile{it<=3}Software Corporation All rights reserved. Slide 30 JGGUG G*Workshop Copyright(C) 2012 NTT == [4,5]
    60. 60. モジュール化http://www.flickr.com/photos/aplumb/3890003295/
    61. 61. モジュール化(1) 2.0新機能groovy-X.X.X.jarを「拡張モジュール」の集合として再構成 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モジュールとしても分割されている 依存性がきっちり定義されている Slide # 32 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    62. 62. モジュール化(2)拡張モジュールは「カスタム拡張メソッド」を提供できる GDKメソッドのように既存クラスにメソッドを追加する カテゴリとは異なり、静的Groovy配下で利用可能 @Grabで取り込んだ場合でもカスタム拡張メソッドは有効。拡張モジュールは誰でも作れ、実体は以下のような内容の「org.codehaus.groovy.runtime.ExtensionModule」ファイルをMETA-INF/services directoryに含めたJarファイルmoduleName=groovy-streammoduleVersion=0.5.1extensionClasses=groovy.stream.StreamExtensionstaticExtensionClasses=Slide # 33 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    63. 63. まとめSlide # 34 http://www.flickr.com/photos/limonada/214375219/ JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    64. 64. GEP11から見るGroovy 3 GEP11 - Groovy 3 semantics and new MOP 問題のあるセマンティクスを修正・改善 Removing default null argument Removing automatic list expansion Changing Safe Navigation to stop evaluation ユーザ提案 Instance based Categories MOP2 … invokedynamicを前提としたMOPの全面見直し invokeMethodは単なるメソッドコールではなく、 MethodHandlerで置換されるプレースホルダとなる GEP…Groovy Enhancement Proposal Slide # 35 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    65. 65. まとめ静的Groovyは2.0の目玉ではあるものの、誰もが使わなければならないものでもない 実開発への適用はもうちょっと待った方が良いかも Grailsでの採用を経て鍛錬されることを期待indy対応はまだまだですね今後は、非標準拡張モジュールによるエコシステム成長(プラグイン化)が期待されるSlide # 36 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.
    66. 66. 参考URLhttp://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.pdf Slide # 37 JGGUG G*Workshop Copyright(C) 2012 NTT Software Corporation All rights reserved.

    ×