Recommended
PDF
PDF
PDF
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
PDF
PDF
Shibuya JVM Groovy 20150418
PDF
Java x Groovy: improve your java development life
PPTX
Java Puzzlers JJUG CCC 2016
PDF
PDF
PDF
Java SE 7 InvokeDynamic in JRuby
PDF
PPTX
PDF
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
PDF
Java puzzlers 2013 at JavaFesta Japan
PDF
C++ Transactional Memory言語拡張の紹介
PPTX
PDF
PDF
unique_ptrにポインタ以外のものを持たせるとき
PPT
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
PPT
G*workshop sendai 20100424(v2)
PDF
KEY
PDF
xUTP Chapter26. Dependency Injection
PDF
PPTX
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
More Related Content
PDF
PDF
PDF
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
PDF
PDF
Shibuya JVM Groovy 20150418
PDF
Java x Groovy: improve your java development life
What's hot
PPTX
Java Puzzlers JJUG CCC 2016
PDF
PDF
PDF
Java SE 7 InvokeDynamic in JRuby
PDF
PPTX
PDF
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
PDF
Java puzzlers 2013 at JavaFesta Japan
PDF
C++ Transactional Memory言語拡張の紹介
PPTX
PDF
PDF
unique_ptrにポインタ以外のものを持たせるとき
PPT
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
PPT
G*workshop sendai 20100424(v2)
PDF
KEY
PDF
xUTP Chapter26. Dependency Injection
Viewers also liked
PDF
PPTX
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
PDF
PDF
PDF
PDF
Web API Design for JAX-RS
PDF
Session 17 ic2011 snippen
PDF
PDF
Treasure Dataを支える技術 - MessagePack編
PPTX
PDF
PDF
Similar to Xtend30分クッキング
PPTX
PDF
PDF
KEY
JJUG CCC 2012 Real World Groovy/Grails
PDF
PPTX
PDF
Kink: invokedynamic on a prototype-based language
PDF
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PDF
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
PPTX
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
PDF
PPTX
PDF
PDF
PDF
PPTX
PDF
PDF
More from Shinichi Kozake
PDF
PDF
あなたとAndroid!?今すぐダウンロード
PDF
PDF
PDF
PDF
あなたとAndroid 今すぐダウンロード!? Android開発で変わる SIerのJava技術事情について
PDF
PDF
PDF
生きろ!チーム開発! 300人月の仲間はみな死んだ
PDF
PDF
PDF
PDF
PDF
ODP
PPT
Xtend30分クッキング 1. 2. 3. 4. 5. 6. 7. 8. Xtend news!
JavaOne 2012
Xtend at JavaOne
10/2 10:00
Sebastian's プレゼンテーション
on Xtend
9. Xtend
30 分 クッキング
愛 は X tend にある。
関ジャバの提供でお送りします。
10. 先生のレシピ
先生のレシピ
@s_kozake 先生 s_kozake せんせい
Xtend 研究家・トラブル火消士。
某大学卒業後、某大手 SIer 企業での下積み ( 常駐 ) を経て
自社のビックプロジェクトに従事するに至る。
2 人の娘さんの父親でもあり、過酷な育児の日々の中、
「 No ドラクエ No ライフ」を嫁に提案中。
著プレゼン / LT (http://www.slideshare.net/s_kozake)
「 Play! Together 」( Play Framework 勉強会 in 関西)
「 About Jobs 」(やきに駆動 秋の Java 祭典スペシャル in 大阪~こりん星)
「 MyBatis で流れるようなメソッドチェーン」(やきに駆動 秋の Java 祭典スペシャル in 大阪~こりん星)
「システムアーキテクトになる前に覚えておきたい技術とか色々」(鹿駆動勉強会)
「たのしい関数型」(第 1 回 関数型言語勉強会 大阪)
著ブログ (http://ameblo.jp/kozake)
「はじめての変態」(変態アドベントカレンダー 2011 )
「変態アドベントカレンダー 2011 の QR コード作りました」(変態アドベントカレンダー 2011 )
「 cron4j のご紹介」( Java Advent Calendar 2011 )
「 Play Excel !」( Play! framework Advent Calendar 2011 )
「おめでたい話と悩みごと」(変態アドベントカレンダー 2011 )
11. 12. 13. Xtend のコンセプト
Python や Ruby と同等の表現力
互換性問題のない Java
Java の構文とコンセプトをできるだけ再利用
Java アプリケーションを読みやすく表現力高く
14. Xtend は Java のソースファイルを生成する
Java バイトコード
0: aload_0
1: invokespecial
4: return
0: getstatic
3: ldc #3;
5: invokevirtual
8: return
Java ソースコード Java バイトコード
import org.eclipse.xtext.xbase.lib.InputOutput; 0: aload_0
1: invokespecial
public class HelloWorld { 4: return
public static void main(final String[] args) { 0: getstatic
InputOutput.<String>println("Hello World"); 3: ldc #3;
} 5: invokevirtual
}
8: return
要するに、 Java にとっての「 CoffeeScript 」
15. 16. 17. 18. 19. 20. Xtend
<1 人分 >
Eclipse Juno ---------------------------1 Download
Xtend-2.3.1 ----------------------------1 Download
Windows7 -----------------------------1 ライセンス
コーヒー ------------------------------5 ~ 10 本
嫁の理解 ------------------------------2 人日
やる気 --------------------------------- 少々
21. 22. 下の URL を入力し、 Xtend-2.3.1 を選択。
http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/
23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Demo ソース「 Hello World 」
HelloWorld.xtend
package demo
class HelloWorld {
def static void main(String... args) {
println('Hello World!')
}
}
HelloWorld.java
package demo;
import org.eclipse.xtext.xbase.lib.InputOutput;
@SuppressWarnings("all")
public class HelloWorld {
public static void main(final String... args) {
InputOutput.<String>println("Hello World!");
}
}
33. Demo ソース「 FizzBuzz 」
FizzBuzz.xtend FizzBuzz2.xtend
package demo package demo
class FizzBuzz { class FizzBuzz2 {
def static void main(String... args) { def static void main(String... args) {
}
new FizzBuzz().run
More }
new FizzBuzz2().run;
Simple
def void run() { def void run() {
var i = 1 (1..100).forEach [ println(it.fizzbuzz) ]
while (i <= 100) { }
println(fizzbuzz(i))
i = i + 1 def fizzbuzz(int i) {
} switch i {
} case (i % 15 == 0) : 'fizzbuzz'
case (i % 3 == 0) : 'fizz'
def String fizzbuzz(int i) { case (i % 5 == 0) : 'buzz'
if (i % 15 == 0) { default : i.toString
return 'fizzbuzz' }
} else if (i % 3 == 0) { }
return 'fizz' }
} else if (i % 5 == 0) {
return 'buzz'
} else {
return String::valueOf(i)
}
}
}
34. Demo テストソース「 FizzBuzz2Test 」
FizzBuzz2Test.xtend
package demo
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.Test
class FizzBuzz2Test {
extension FizzBuzz2 test = new FizzBuzz2()
@Test
def testFizzBuzz() {
assertThat (1.fizzbuzz, is('1'))
assertThat (3.fizzbuzz, is('fizz'))
assertThat (5.fizzbuzz, is('buzz'))
assertThat (15.fizzbuzz, is('fizzbuzz'))
}
}
35. 36. 37. 38. 39. 拡張メソッド(組み込みライブラリ)
デフォルトで既存クラスの拡張メソッドが用意されています。
・ ObjectExtensions
・ IterableExtensions
・ MapExtensions
・ ListExtensions
・ CollectionExtensions
・ BooleanExtensions
・ IntegerExtensions
・ FunctionExtensions
val obj = newArrayList(1,2,3)
println(obj.map[it * 2]) // [2, 4, 6]
println(obj.getClass.getName) // java.util.ArrayList
40. 拡張メソッド(ローカル Extension インポート)
クラス内または親クラスの可視性のある非 static メソッドは
自動的に拡張メソッドとして使えます。
def void run() {
println(15.fizzbuzz)
}
def fizzbuzz(int i) {
switch i {
case (i % 15 == 0) : 'fizzbuzz'
case (i % 3 == 0) : 'fizz'
case (i % 5 == 0) : 'buzz'
default : i.toString
}
}
41. 拡張メソッド( Extension インポート)
ヘルパークラスなどが用意する static メソッドは、
import static の後ろに extension キーワードを配置
することで、全ての static メソッドを拡張メソッドとして
import できます。
package demo
import static org.junit.Assert.*;
static import static org.hamcrest.CoreMatchers.*;
package demo Import import static extension demo.JsonUtil.*;
extension
class JsonUtil { import org.junit.Test
def static writeJson(Object obj) {
println(obj.toString) class TestJsonUtil {
}
} @Test
def void testWriteJson() {
val obj = 'test'
obj.writeJson
}
}
42. 拡張メソッド( Extension フィールド)
フィールド定義に extension キーワードを追加すると、
そのインスタンスのメソッドは拡張メソッドとなります。
class FizzBuzz2Test {
extension FizzBuzz2 test = new FizzBuzz2()
@Test
def testFizzBuzz() {
assertThat (1.fizzbuzz, is('1'))
:
}
}
static な extension import と比べて、フィールド定義による
extension の利点は、実装にバインドされないことです。
factory や依存性注入、 setter メソッドにより外部から
実装を簡単に交換できます。
43. 44. ローカル型推論
変数の型は右の式から推論されます。
また、メソッドの戻り値もメソッド本体から推測されます。
package demo;
import java.util.Date;
package demo
@SuppressWarnings("all")
import java.util.Date
public class DemoClass {
private final int a = 1;
class DemoClass {
val a = 1
private String b = "test";
var b = 'test'
public var c = 2
public int c = 2;
def hoge() {
public String hoge() {
val d = new Date
String _xblockexpression = null;
'hoge'
{
}
Date _date = new Date();
}
final Date d = _date;
_xblockexpression = ("hoge");
}
return _xblockexpression;
}
}
45. 46. 47. ステートメントレス( if 式)
if (p) e1 else e2
if は p の結果により e1 か e2 を返す式です。
val a = if (true) 1 else 2
println(a) // 1
else をオプションで省略可能です。
val a = if (false) 1
val b = if (false) 'a'
println(a) // 0
println(b) // null
48. ステートメントレス( for 式)
for (T1 variable : arrayOrIterable) expression
for は void を返す式です。
variable の型は arrayOrIterable の型から型推論される
ので省略可能です。
val arr = newArrayList(1,2,3,4,5)
for (i : arr) {
println(i)
}
49. ステートメントレス( try-catch 式)
try-catch も式です。以下のようなコードを書くことで
今まで必要だったローカル変数を省略できます。
val s = 'a'
val n = try {
Integer::parseInt(s)
} catch (NumberFormatException ex) {
-1
}
println(n) // -1
50. ステートメントレス(その他)
ローカル変数 it を使用すると、 it に代入された
インスタンスのフィールドやメソッドがローカルのように
扱えます。
package demo
class Hoge {
@Property
String fuga
}
class DemoClass {
def static void main(String... args) {
val it = new Hoge
fuga = 'test'
println(fuga) // test
}
}
51. ステートメントレス(その他)
?. によるメソッド呼び出しで、 null 安全な呼び出し
が可能です。
var hoge = new Hoge Hoge _hoge = new Hoge();
hoge?.hello Hoge hoge = _hoge;
if (hoge!=null) hoge.hello();
hoge = null hoge = null;
hoge?.hello if (hoge!=null) hoge.hello();
52. 53. 54. 強力な Switch 式
Switch 式は Java の switch 文とはかなり異なっています。
・下への落下がない
・特定の値に限定されず、任意のオブジェクトが使用可能
val s = 'ho'
val ret = switch s + 'ge' {
case s.length > 5 : 'so long'
case 'hoge' : 'equal hoge'
default : 'not'
}
println(ret) // equal hoge
まず、 switch の式が評価されます。
式の型が boolean 型なら、 true で case にマッチします。
boolean 型以外なら、 Object.equals(Object) が比較に使用されます。
case にマッチしたら、コロンの後の式が評価され、式全体の結果となります。
55. 強力な Switch 式
ケースガードに加え、型ガードもサポートしています。
def length(Object x) {
switch x {
String case x.length > 0 : x.length // length is define String
List<?> : x.size // size is define for List
default : -1
}
}
switch の値が型と一致しているのみ、ケースと比較します。
型と一致しない場合、 case の式は評価されません。
両方が一致した場合、コロンの後の式が評価されます。
switch の値が変数の場合、自動的にその型にキャストされます。
Java の instance of やキャストに比べて読みやすく型安全です。
56. 57. ラムダ
Xtend は SAM(Single Abstract Method) Type の
インタフェースをラムダ式として表せます。
public interface Hello { class DemoClass {
void hello(String s);
} def static void main(String... args) {
helloWorld([String s | println(s)])
}
def static void helloWorld(Hello o) {
o.hello('hello world!')
}
}
上記のように角括弧で囲んだ部分がラムダ式です。
この構文は、 Smalltalk に影響を受けたらしいです。
| の区切りでパラメータ宣言と式が書かれています。
58. ラムダ
public interface Hello { class DemoClass {
void hello(String s);
} def static void main(String... args) {
helloWorld([String s | println(s)])
}
def static void helloWorld(Hello o) {
o.hello('hello world!')
}
}
パラメータの型はインタフェースの型から推測できるので、省略可能です。
59. ラムダ
public interface Hello { class DemoClass {
void hello(String s);
} def static void main(String... args) {
helloWorld([println(it)])
}
def static void helloWorld(Hello o) {
o.hello('hello world!')
}
}
パラメータが 1 つの場合、パラメータ宣言が省略可能です。
省略した場合、パラメータは it という名前の変数にバインドされます。
60. ラムダ
public interface Hello { class DemoClass {
void hello();
} def static void main(String... args) {
helloWorld([| println('hello world!')])
}
def static void helloWorld(Hello o) {
o.hello()
}
}
パラメータないメソッドは上記のように書けます。
| の記述がいることに注意してください。
61. ラムダ
public interface Hello { class DemoClass {
void hello(String s);
} def static void main(String... args) {
helloWorld(3) [
println(it)
]
}
def static void helloWorld(int n, Hello o) {
(1..n).forEach [ o.hello('hello world!') ]
}
}
メソッド一番右側のパラメータがラムダ式の場合、パラメータリストの後に
渡すことができます。
62. ラムダ
public interface Hello { class DemoClass {
void hello(String s);
} def static void main(String... args) {
val name = 'duke'
helloWorld [ println(it + ' ' + name) ]
}
def static void helloWorld(Hello o) {
o.hello('hello world!')
}
}
Java 同様、ラムダ式の外部の final 変数参照することが可能です。
63. ラムダ
SAM Type がなくても、下記のように書けます。
val f = [int n | n**3 ]
println(f.apply(2)) // 8.0
final Function1<Integer,Double> _function = new Function1<Integer,Double>() {
public Double apply(final Integer n) {
double _power = Math.pow(n, 3);
return _power;
}
};
final Function1<Integer,Double> f = _function;
Double _apply = f.apply(Integer.valueOf(2));
InputOutput.<Double>println(_apply);
戻り値が void の場合、 Procedures 、それ以外は Functions となります。
64. ラムダ
Xtend は関数型の簡略構文もサポートしています。
val (int) => double f = [int n | n**3 ]
println(f.apply(2)) // 8.0
=
val Function1<Integer,Double> f = [int n | n**3 ]
println(f.apply(2)) // 8.0
65. 66. 67. 68. 中置演算子と演算子のオーバーロード
使用可能な演算子とそれに対応するメソッドシグネチャの
完全なリストです。
また、下の表は昇順で演算子の優先順位を定義しています。
e1 += e2 e1.operator_add(e2)
e1 || e2 e1.operator_or(e2)
e1 && e2 e1.operator_and(e2)
e1 == e2 e1.operator_equals(e2) e1 <> e2 e1.operator_diamond(e2)
e1 != e2 e1.operator_notEquals(e2) e1 ?: e2 e1.operator_elvis(e2)
e1 < e2 e1.operator_lessThan(e2) e1 <=> e2 e1.operator_spaceship(e2)
e1 > e2 e1.operator_greaterThan(e2) e1 + e2 e1.operator_plus(e2)
e1 <= e2 e1.operator_lessEqualsThan(e2) e1 – e2 e1.operator_minus(e2)
e1 >= e2 e1.operator_greaterEqualsThan(e2) e1 * e2 e1.operator_multiply(e2)
e1 -> e2 e1.operator_mappedTo(e2) e1 / e2 e1.operator_divide(e2)
e1 .. e2 e1.operator_upTo(e2) e1 % e2 e1.operator_modulo(e2)
e1 => e2 e1.operator_doubleArrow(e2) e1 ** e2 e1.operator_power(e2)
e1 << e2 e1.operator_doubleLessThan(e2) ! e1 e1.operator_not()
e1 >> e2 e1.operator_doubleGreaterThan(e2) - e1 e1.operator_minus()
e1 <<< e2 e1.operator_tripleLessThan(e2)
e1 >>> e2 e1.operator_tripleGreaterThan(e2)
69. 70. 71. 72. プロパティ
フィールド変数を @Property アノーテーション定義することで
setter / getter を自動生成してくれます。
@SuppressWarnings("all")
public class DemoClass {
private String _hoge;
class DemoClass {
public String getHoge() {
@Property return this._hoge;
String hoge }
}
public void setHoge(final String hoge) {
this._hoge = hoge;
}
}
フィールドが指定されたコンテキストから
アクセスできない場合、 setter が使用されます。
これが @Property アノーテーションがローカルフィールドを
_myProperty にリネームする理由です。
73. プロパティ
また、クラス定義に @Data アノーテーション定義することで
値オブジェクトとしてクラスを定義できます。
import org.eclipse.xtend.lib.Data;
import org.eclipse.xtext.xbase.lib.util.ToStringHelper;
@Data
@SuppressWarnings("all")
public class DemoClass {
private final String _hoge;
@Data
public String getHoge() {
class DemoClass { return this._hoge;
}
String hoge public DemoClass(final String hoge) {
} super();
this._hoge = hoge;
}
@Override
public int hashCode() {
:
@Override
public boolean equals(final Object obj) {
:
@Override
public String toString() {
:
}
74. 75. 76. 77. 30 分 Xtend クッキング
Thank you a lot
愛 は Java エンジニア にある。
関ジャバの提供でお送りしました。