BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java EE 7が式言語の拡張を提供

Java EE 7が式言語の拡張を提供

原文(投稿日:2013/07/08)へのリンク

Java EE 7の数多い機能拡張の中に、Expression Language 3として知られるJava Expression Language APIのオーバーホールがある。JSR-341で仕様化された、EL APIの多くの機能拡張には、ラムダ式、静的フィールドとメソッドアクセス、そしてコレクション処理とスタンドアローンプロセスモードの改善が含まれている。

Java EE 7以前では、Java Expression Languageは、JavaServer Faces と JavaServer Pages APIに密結合したコンポーネントだった。JSR-341 は、Java Expression Language をJava EEのビューレイアAPIから切り離された、個別のエンティティとして導入した。— 尚相互運用可能だが —

EL API は、開発者にアドホックにJava ELを呼び出す機能を提供するようになった。新しく導入された ELProcessor クラスのインスタンスを生成して、そのevalメソッドを評価されるスクリプトを表す文字列と一緒に呼び出すと、Javaアプリケーションのスコープにおける変数として使える結果を返す。

ELProcessor el = new ELProcessor();
assert ((Integer)el.eval("a = [1, 2, 3]; a[1]")) == 2;
	

スタンドアローンモードに加えて、JSR-341 は Java EE 開発者にラムダ式を書く機能をもたらした。ラムダ式は、標準版のJavaでは来年のJava 8 リリースにずれ込んでいるが、EL開発者はスクリプト中にラムダシンタックスを使うことが出来る。昨年の JavaOne カンファレンスで、 JSR-341 スペックにリーダーであるKin-man Chung 氏は、スペックの専門家グループは、Java 8の Project Lambda の開発者と良く相談して、Java EL と Java 8間で共通のAPIと将来の相互運用性を確保しようとしている、と言っている。

ELProcessor el = new ELProcessor();
assert ((Integer)(el.eval("((x,y) -> x+y)(4, 5)"))) == 9;

コレクションを操作するために、Java EL stream APIには、forEach, reduce, filter, mapなどの演算子が含まれている。Java EL のコレクション処理に導入された多くのフィーチャと概念も、Java 8の一部としてJavaに統合される予定である。当面は、しかし開発者は、JSR-341の拡張の一部として、遅延と正格ストリーム、そしてラムダ式の恩恵を受けることが出来る。

ELProcessor el = new ELProcessor();
List list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    list.add(i);
}
el.defineBean("list", list);
List processedList = (List)el.eval("list.stream().filter( x -> x <= 3).map(x -> x * 5).toList()");
assert processedList.get(0) == list.get(0);
assert processedList.get(1) == list.get(5);
assert processedList.get(2) == list.get(10);
assert processedList.get(3) == list.get(15);

更にJSR-341 の一部として追加されたフィーチャは、長い間待たされたJava ELの拡張機能で、開発者が直接スタティックなフィールドとメソッドに直接アクセス出来るようになる。デフォルトでjava.lang.* は、全てのスクリプトに予めインポートサれているので、ELスクリプトの開発者は、ELProcessorインスタンス上の ELManagerアセットによって、ELコンテキストにインポートされた、あらゆるスタティックなアセットにアクセスできる。

ELProcessor el = new ELProcessor();
el.getELManager().importStatic("com.company.Class.STATIC_FIELD");
assert (el.eval("Math.random()") instanceof Double);
System.out.println(el.eval("STATIC_FIELD"));

JSR-341の一部としてリリースされるJava Expression Languageの拡張機能は、JSP と JSF の実装、更に新しく提供されるスタンドアローン処理モードにおいて、強力な助っ人なることが証明されるだろう。

この記事に星をつける

おすすめ度
スタイル

BT