More Related Content Similar to Java SE 再入門(20) Java SE 再入門1. JavaSE 再入門
To Java SE 8 from J2SE 1.4
September 2014
@minazou67 2. JavaSE再入門
はじめに
本スライドは、J2SE 1.4 からJava SE 8 の新機能について広く浅く解説し、 短時間でJava SE に関する知識を網羅 的に学習することを目的としています。
Java を学ぶきっかけになれば幸いです。
2
•本スライドでは、Java の基本的な事項(変数、演算子、制御構文、クラスなど) については取り扱いません。
•本スライドで紹介している機能が、Java SE の新機能の全てではありません。
•本スライドに掲載されている会社名、製品名、サービス名、ロゴは、各社・各団体の商標または登録商標です。 4. JavaSE再入門
Goal
Java SEの各バージョンの更新内容 を再確認することにより、既存の知 識を整理すると共に、最新バージョ ンのJava SE について学び、より モダンなプログラミングスタイルを 身に付けましょう。
4
6. JavaSE再入門
J2SE 1.4
J2SE 5.0
2002年2月
JSR 59
Java SE 6
Java SE 7
Java SE 8
2004年9月
JSR 176
2006年12月
JSR 270
2011年7月
JSR 336
2014年3月
JSR 337
Java Release History
2年7ヶ月
2年3ヶ月
4年7ヶ月
2年8ヶ月
6
7. JavaSE再入門
JCP (Java Community Process)
Java 技術のための標準技術仕様やプロセスを公開している機関
Oracle, IBM, Red Hat, Fujitsu, Eclipse Foundation, Intel, Twitter
などが執行委員会のメンバーです。
JSR (Java Specification Requests)
個々のJava 技術の仕様
仕様(Spec), リファレンス実装(RI), 技術互換性キット(TCK) の提供が必要で、
Java SE やJava EE の各バージョンも梱包的なJSR として定義されています。
Java 関連用語1
JEP (JDK Enhancement Proposals)
JDK の機能拡張提案
JDK リリースプロジェクトと関連の取り組みのための長期的なロードマップで、個々 のJEP は技術的観点からの提案・検討・結果の記録です。
7
8. JavaSE再入門
JRE (Java Runtime Environment)
Java 実行環境
Java 仮想マシン(JVM) と実行時ライブラリのセット
JDK (Java Development Kit)
Java 開発キット
開発ツール群と開発ツールが使用する非公開JRE のセット
(非公開JRE は、開発ツールの実行のためだけに存在します。)
Java 関連用語2
8
9. JavaSE再入門
JVM (Java Virtual Machine)
Java 仮想マシン
コンパイラが生成するJava バイトコードをプラットフォー ム固有のネイティブコードに変換して実行するソフトウェア
Java 関連用語3
9
Java バイトコード(Java byte code)
Java 仮想マシン用の命令セット
ターゲットマシンのアーキテクチャに依存することなく実行 速度を向上させるための中間コード 10. JavaSE再入門
JNI (Java Native Interface)
他言語との相互運用のためのインタフェース仕様
Java から他言語で作成したライブラリのネイティブメソッド を呼び出すことが可能、またその逆も可能
Java 関連用語4
10
JNDI (Java Naming and Directory Interface)
ネーミグサービスやディレクトリサービスを参照 するためのインタフェース仕様
LDAP やDNS, RMI, DataSource のようなサービスに対応 11. JavaSE再入門
リファレンス実装(Reference Implementation)
JSR で定めた仕様の実証となる実装
参照実装、RI とも呼ばれ仕様が実装可能かどうかの確認に使用
Java 関連用語5
JSR
仕様
リファレンス実装
JSR 337
Java SE 8
OpenJDK
JSR 342
Java EE 7
GlassFish
JSR 346
CDI 1.1
Weld
JSR 349
Bean Validation 1.1
Hibernate Validator
JSR 338
JPA 2.1
Hibernate
JSR 339
JAX-RS 2.0
Jersey
JSR 344
JSF 2.2
Mojarra
JSR 356
WebSocket
Tyrus
11
12. JavaSE再入門
•オブジェクト指向プログラミング言語
•強い静的型付け言語
•Write Once, Run Anywhere (Platform 非依存)
•コンパイラによりJava バイトコードを生成
•Java 仮想マシン(JVM) の上で動作
•ガベージコレクションによるメモリ管理
•C 言語ライクな構文
•マルチスレッドをサポート
•高い互換性(ソース・バイナリ・プラットフォーム)
Java の特徴
12
13. JavaSE再入門
Java SE (Java Platform, Standard Edition)
標準の機能セット
lang and util Base Libraries, Beans, JNI, JDBC, JNDI, Java 2D, Swing, JavaFX, etc…
Java EE (Java Platform, Enterprise Edition)
企業向けの機能セット
Servlet, JSP, JSTL, JSF, CDI, EJB, JPA, JMS, JTA, JAX-RS, JAX-WS, etc…
Java Platform
Java ME (Java Platform, Micro Edition)
組み込み向けの機能セット
Java SE のサブセット+組み込み向けAPI
13
14. JavaSE再入門
JVM の実装
14
Java HotSpot VM
Just-In-Time(JIT)コンパイルが特徴のJVM
Sun Microsystems 社が開発・提供していたJVM で、現在はOracle 社が提 供・サポートしています。OpenJDK のJVM の基盤となっており、Mac でも動作可 能です。
Oracle JRockit JVM
Intel CPU, サーバーサイド用途に最適化されたJVM
BEA Systems 社が開発・提供していたWebLogic Server 付属のJVMで、 現在はOracle 社が提供・サポートしています。
その他
IBM 社製のIBM J9 VM や富士通社製のFJVM、日立社製の独自のJava VM など多数の実装が存在しています。 15. JavaSE再入門
JVM の起動モード
15
Client Mode
クライアントアプリケーション用に最適化され、起動時間が 短くなり、メモリーフットプリントが減少
64bit 版のJDK では、このオプションを無視し、代わりにserver モードが選択されます。
Server Mode
サーバーアプリケーション用に最適化され、起動時間は長く なるが、スループットが向上
マルチプロセッサで且つ、物理メモリが2GB 以上あるとサーバー クラスマシンとして検出され、server モードで起動されます。 16. JavaSE再入門
JVM で動作する言語
No
言語
概要
1
Scala
オブジェクト指向言語と関数型言語の特徴を統合したプ ログラミング言語。Java との親和性が高い。
2
Groovy
直接Java バイトコードにコンパイルされる動的プログ ラミング言語。Java との親和性が高い。
3
JavaScript
プロトタイプベースのオブジェクト指向プログラミング 言語。JVM 用のJavaScript エンジンで動作。
4
Clojure
関数型言語であるLISP 系の言語。
5
Kotlin
JetBrains 社が開発した静的型付けのオブジェクト指向 プログラミング言語。
6
Jython
Python のJava 実装プログラミング言語。
7
JRuby
Ruby のJava 実装プログラミング言語。
16
17. JavaSE再入門
IDE (統合開発環境)
No
言語
概要
1
Eclipse
IBM 社によって開発されたJava ベースのオープンソー スの統合開発環境。Java 以外の言語もサポートしている。 現在は非営利組織であるEclipse Foundation がEclipse の継続的な開発を管理し、方向付けを行っている。日本 のSIer によるJava 開発でよく使用されるIDE。
2
NetBeans
Oracle 社(買収以前はSun Microsystems 社) を中心と したコミュニティにより開発されているオープンソース の統合開発環境。Java 以外の言語もサポートしている。 Java EE への対応が最も早く、Java EE を手厚くサポー トしているのが特徴。
3
IntelliJ IDEA
JetBrains 社が開発した、多言語対応の統合開発環境。 Web 系非対応、Java EE 非対応など機能を限定したオー プンソースのCommunity Edition も存在する。Scala やGroovy の開発者に人気がある。
17
20. JavaSE再入門
J2SE 1.4 の主要JSR
JSR
仕様
JSR 005
XML Parsing (XML 解析)
JSR 010
Preferences API (環境設定API)
JSR 031
XML Data Binding (XML データバインディング)
JSR 041
A Simple Assertion Facility (単純なアサーション機能)
JSR 047
Logging API (ロギングAPI)
JSR 051
New IO APIs (新しいIO のAPI)
JSR 054
JDBC 3.0
JSR 055
Certificate Path API (証明書パスAPI)
JSR 056
Java Network Launching API (ネットワーク起動API)
JSR 057
Long Term Persistence for JavaBeans 1.0
(JavaBeans の長期持続性)
20
21. JavaSE再入門
•アサーション機能の提供
•Java Web Start を導入し、Java アプリケーションの配備と 実行を簡素化
•IPv6 をサポート
•JPDA (Java Platform Debugger Architecture) の機能拡張
高速デバッグ機能をサポート(HotSpot テクノロジーを活用)
•javadoc ツールの大幅な改善(新規タグ、新規オプション等)
•CORBA 用の新規ツール(orbd、servertool) の提供と既存 ツール(idlj、rmic) の改善
•XML 処理用のAPI の追加とXML データバインディング機能 の追加
J2SE 1.4 の主な変更点1
21
22. JavaSE再入門
•標準のロギングAPI (java.util.logging パッケージ) を提供
•JDBC 3.0 をサポート
•Java Image I/O API (javax.imageio パッケージ) を提供
•Java Print Service API (javax.print パッケージ) を提供
•Java 2D API、Reflection API のパフォーマンスを大幅に改善
•多数の新機能(新しいdrag & drop アーキテクチャや新規 フォーカスモデル等) とLook & Feel をSwing へ追加
•Unicode 3.0 をサポート
•Collections Framework の機能拡張(LinkedHashMap、 IdentityHashMap の追加等)
•正規表現(java.util.regex パッケージ) をサポート
J2SE 1.4 の主な変更点2
22
23. JavaSE再入門
アサーション(表明) は、プログラムが仕様通りに正しく動作し ているかを検証するための機能です。
以下のように、assert ステートメントで表明します。
Assertion
23
assertExpression1 ;
assertExpression1 : Expression2 ;
式1 はboolean 型の式で、false の場合にAssertionError が発 生します。式2 はエラーの詳細メッセージを返す任意の式です。
java コマンドに「-ea」オプションを指定して実行するとアサー ションが有効になります。 24. JavaSE再入門
Assertion の実装例
24
publicstaticvoidverify() {
inti= 1;
// 詳細メッセージなし
asserti== 1;
System.out.println("1");
// 詳細メッセージあり
asserti== 2 : "i = "+ i;
System.out.println("2");
}
1
Exception in thread "main" java.lang.AssertionError: i = 1
at com.sample.se4.AssertionSample$Assertion.verify(AssertionSample.java:17)
at com.sample.se4.AssertionSample.main(AssertionSample.java:7) 25. JavaSE再入門
Java 標準のロギングAPI (java.util.logging パッケージ) が提供 され、外部ライブラリを使用せずに標準API のみでログ出力が可 能になりました。ロギングAPI には、以下の特徴があります。
Java Logging API
25
•ログレベルがApache Log4j やApache Commons Logging とは異なる
•logging.properties ファイルにログレベルや出力ハンドラ、 出力フォーマットを記述
•JRE ディレクトリのlib 配下のlogging.properties ファイル をデフォルトで使用
•Java コマンド実行時に任意のlogging.properties ファイルを 指定可能 26. JavaSE再入門
Java Logging APIの使用例
26
importjava.util.logging.Logger;
publicclassLoggingSample {
publicstaticvoidmain(String[] args) {
Logger logger= Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
logger.info("info");
logger.warning("warning");
logger.severe("severe");
}
}
2014/09/09 14:34:09 com.sample.se4.LoggingSample main
情報: info
2014/09/09 14:34:09 com.sample.se4.LoggingSample main
警告: warning
2014/09/09 14:34:09 com.sample.se4.LoggingSample main
致命的: severe 29. JavaSE再入門
J2SE 5.0 の主要JSR 1
JSR
仕様
JSR 003
Java Management Extensions (JMX) Specification
(Java 仮想マシン管理の仕様)
JSR 013
Decimal Arithmetic Enhancement (小数点演算の強化)
JSR 014
Add Generic Types To The Java Programming Language (総称型の追加)
JSR 028
Java SASL Specification (Java のSASL 仕様)
JSR 114
JDBC Rowset Implementations (JDBC 行セット実装)
JSR 133
Revise Java memory model
(Java のメモリモデルの見直し)
JSR 160
Java Management Extensions (JMX) Remote API
(Java 仮想マシン管理のリモートAPI)
JSR 163
Java Platform Profiling Architecture
(Java Platform のプロファイリング·アーキテクチャ)
29
30. JavaSE再入門
J2SE 5.0 の主要JSR 2
JSR
仕様
JSR 166
Concurrency Utilities (並行処理ユーティリティ)
JSR 174
Monitoring and Management specification for the Java Virtual Machine
(Java 仮想マシン用の監視および管理の仕様)
JSR 175
A Metadata Facility for the Java Programming Language
(Java プログラミング言語用のメタデータ機能)
JSR 200
Network Transfer Format for Java Archives
(Java アーカイブ用のネットワーク転送フォーマット)
JSR 201
Extending the Java Programming Language with Enumeration, Autoboxing, Extended for loops and Static import
JSR 204
Unicode Supplementary Character Support
(Unicode 補足文字のサポート)
JSR 206
Java API for XML Processing (JAXP) 1.3
(XML データ処理用のJava API)
30
31. JavaSE再入門
•BigDecimal クラスの強化による小数点演算の強化
(固定精度の浮動小数点計算をサポート)
•総称型(Generics) の追加による、コンパイラのタイプセーフ 検証の強化(キャスト作業の省略と型安全)
•アノテーション(注釈) によるメタデータ機能の追加
(ボイラープレートコードの自動生成が可能)
•列挙型(enum)、オートボクシング・アンボクシング、拡張 for 文、静的インポート、可変長引数による拡張
•Unicode 4.0 および補助文字のサポート
•JAR ファイルを高圧縮する新しいPack200 形式をサポート
(JAR ファイルのダウンロードサイズを大幅に削減)
J2SE 5.0 の主な変更点1
31
32. JavaSE再入門
•Swing 用の新しいLook & Feel を提供(Synth、Ocean)
•java.lang.ProcessBuilder クラスを提供
(より簡単な方法でサブプロセスを起動可能)
•printf スタイルのjava.util.Formatter クラスとインタフェー スを提供
•複数のJava VM でバイトコードを共有
(アプリケーションの起動時間とサイズを軽減)
•並行処理ユーティリティを提供
(java.util.concurrent パッケージの追加、ThreadLocal クラスの機能拡張)
•JAXP 1.3 のサポート
(XML データ処理用のJava API を提供)
J2SE 5.0 の主な変更点2
32
33. JavaSE再入門
ジェネリクスは、汎用的な型を取り扱うクラスやインター フェースに型パラメータリスト(型変数) を記述し、インス タンス化する際に型変数に型を与えることにより、コンパ イル時に型を保障しながら汎用的な型を取り扱うための仕 組みです。型変数はメソッドの宣言に対しても指定するこ とができます。
メジャーな実装例としては、コレクションAPI (java.util.List やjava.util.Map) が挙げられ、コードが型 安全になることにより、実行時のClassCastException が 抑制できます。
総称型(Generic type)
33
34. JavaSE再入門
publicclassGenericSample {
publicstaticclassMyClass<K, V> {
privateKkey;
privateVvalue;
publicvoidsetKeyValue(K key, V value) {
this.key= key;
this.value= value;
}
publicKgetKey(){ returnkey; }
publicVgetValue() { returnvalue; }
}
publicstaticvoidmain(String[] args) {
MyClass<String, String> mc= newMyClass<String, String>();
mc.setKeyValue("1", "hoge");
String key= mc.getKey();
System.out.println("key = "+ key);
}
}
総称型の実装例
34
型パラメータリスト
インスタンス生成時 に型を指定 38. JavaSE再入門
基本データ型とラッパークラスの相互自動型変換機能です。
Autoboxing
38
publicvoidautoboxing() {
List<Integer> list= newArrayList<Integer>();
// 古い記法
list.add(newInteger(1));
intx= list.get(0).intValue();
// 新しい記法
list.add(2);
inty= list.get(1);
System.out.println("x = "+ x);
System.out.println("y = "+ y);
} 39. JavaSE再入門
for 文からIterator を除去し簡素化する記述方法です。
拡張for 文
39
publicvoidexpansionLoop(List<Integer> list) {
if(list== null) { return; }
// 古い記法
Iterator<Integer> it= list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
// 新しい記法
for(Integer value: list) {
System.out.println(value);
}
} 40. JavaSE再入門
静的変数や静的メソッドをクラス名を記述せずに使用できるよう にする機能です。
Static Import
40
// 静的インポート
importstaticjava.lang.Math.*;
publicclassStaticImportSample {
publicstaticvoidmain(String[] args) {
// 古い記法
System.out.println("cos(PI) = "+ Math.cos(Math.PI));
// 新しい記法
System.out.println("cos(PI) = "+ cos(PI));
}
} 41. JavaSE再入門
可変個数の引数を持つメソッドを定義可能になりました。
可変長引数
41
publicclassVariableLengthArgumentSample {
// 可変長引数のメソッド
publicstaticvoidvariableLengthArgument(String...args) {
for(String arg: args) {
System.out.println(arg);
}
}
publicstaticvoidmain(String[] args) {
variableLengthArgument("hoge", "fuga");
}
} 43. JavaSE再入門
•2006年12月11日にリリース
•コードネームはMustang
•2013年2月にEOL
•名称がJ2SE からJava SE に変更され、バージョ ン番号から小数点以下が削除された
•大幅な言語仕様の変更はないが、多数の新機能の追 加や管理機能の強化、安定性の向上などが行われた
•テーマは、互換性、開発容易性、診断機能・監視と 管理、エンタープライズデスクトップ、XML & Web サービス、透明性
Java SE 6 概要
43
44. JavaSE再入門
Java SE 6 の主要JSR
JSR
仕様
JSR 105
XML Digital-Signature APIs (XML デジタル署名API)
JSR 173
Streaming API for XML (StAX)
JSR 181
Web-Services Metadata (Web サービス·メタデータ)
JSR 199
Java Compiler API (Java コンパイラAPI)
JSR 202
Java Class-File Specification Update
(Java クラスファイルの仕様更新)
JSR 221
JDBC 4.0
JSR 206
Java Architecture for XML Binding (JAXB) 2.0
JSR 223
Scripting for the Java Platform
JSR 224
Java API for XML-Based Web Services (JAX-WS) 2.0
JSR 250
Common Annotations
JSR 269
Pluggable Annotation-Processing API
44
45. JavaSE再入門
•JAXB 2.0 のサポート
(Java オブジェクトとXML のバインディング機能)
•JAX-WS 2.0 のサポート
(JAX-RPC に替わるWeb サービスの新規API 仕様)
•StAX 1.0 のサポート
(JAXB 2.0 でも使用されているXML パーサ)
•JDBC 4.0 のサポート
•JDBC ドライバの自動ロード
•SQL 例外クラスの詳細化
•Java DB(Apache Derby)をJDK にバンドル
Java SE 6 の主な変更点1
45
46. JavaSE再入門
•JavaScript のスクリプトエンジン(Java で実装された Mozilla Rhino) を標準でバンドル
•Swing のマルチスレッド処理をサポートするSwingWorker を提供
•Swing 用の新しいLook & Feel を提供(Nimbus)
•和暦ロケールを含む新しいロケールのサポート
•Java Platform Debugger Architecture (JPDA) の改善
(動作中のJVM へアタッチ可能に)
•Java Visual VM をUpdate 7 からバンドル
(単体の管理ツールで提供されてきた機能をまとめて提供)
•アノテーション処理の標準API を提供
Java SE 6 の主な変更点2
46
47. JavaSE再入門
•コアライブラリの改善
(String クラスへのisEmpty メソッドの追加など)
•Java プログラムからソースコードのコンパイルが可能となる Compiler API を提供
•軽量HTTP サーバをバンドル
(com.sun.net.httpserver パッケージ)
•G1GC 方式のガベージ・コレクションを実験的に導入
•Java Quick Starterの導入(バイトコード共有など)
•次世代Java Plug-in の導入
•Direct3D (ハードウェアアクセラレーション) のサポート
Java SE 6 の主な変更点3
47
48. JavaSE再入門
Java DBは、オラクル社がサポートしているApache Derby の ディストリビューションで、JDK 6 から標準でバンドルされてい ます。Apache Derby は、全てJava で実装されているオープン ソースのリレーショナルデータベース管理システム(RDBMS) で、以下の特徴があります。
Java DB
48
•コンパクトなサイズ(約2.5MB)
•SQL やJDBC API、Java EE テクノロジを完全にサポート
(分散トランザクションやストアドプロシージャ、JNDI などをサポート)
•組み込みモードで動作させることで、アプリケーションへの組み込みが可能
•サーバモードで動作させることで、ネットワーク経由での複数同時接続が可能
•ij (SQL発行用のコマンドラインツール) を使用して、バックアップなどの管理 作業が可能 49. JavaSE再入門
Java VisualVMは、JVM 上で実行されているJava アプリケー ションのモニタリングやプロファイリング、トラブルシューティ ングを行うためのGUI ツールです。
JConsole、jstat、jinfo、jstack などの既存のスタンドアロンツー ルを連携させてJVM からデータを取得し、それらの情報を編集し て画面に表示します。プラグインによる機能追加も可能です。
Java VisualVM
49
50. JavaSE再入門
JavaSE6は、HTTP とHTTPS をサポートしたシンプルな HTTP Server API を提供しています。
Java HTTP ServerAPI
50
publicclassHTTPServerSample {
// HttpHandler の実装クラス
staticclassSampleHandler implementsHttpHandler{
publicvoidhandle(HttpExchange exchange) throwsIOException {
String response= "Hello World";
exchange.sendResponseHeaders(200, response.length());
OutputStream ost= exchange.getResponseBody();
ost.write(response.getBytes());
ost.close();
}
}
publicstaticvoidmain(String[] args) throwsIOException {
HttpServerserver= HttpServer.create(newInetSocketAddress(8000), 0);
server.createContext("/sample", newSampleHandler());
server.setExecutor(null);
server.start();
}
} 53. JavaSE再入門
Java SE 7 の主要JSR
JSR
仕様
JSR 114
JDBC Rowsets (JDBC 行セット)
JSR 203
More new I/O APIs for the Java platform (NIO.2)
JSR 221
JDBC 4.0
JSR 224
Java API for XML Web Services
JSR 269
Pluggable Annotation-Processing API
(プラグイン可能な注釈処理API)
JSR 292
Support for dynamically-typed languages (InvokeDynamic)
JSR 334
Small language enhancements (Project Coin)
JSR 901
Java Language Specification
(Java 言語仕様)
JSR 924
Java Virtual Machine Specification
(Java 仮想マシン仕様)
53
54. JavaSE再入門
•新規ファイルシステムAPI を提供
(java.nio.file パッケージを追加)
•新しいディレクトリ、ファイル表現インターフェース java.nio.file.Path を提供
•ファイル属性、権限の取得・設定API を提供
•ディレクトリツリーの走査用API を提供
•非同期IO のサポート
•シンボリックリンクをサポート
•ファイルシステムの変更通知が可能
•zip をファイルシステムとして処理可能
Java SE 7 の主な変更点1
NIO.2 (More new I/O APIs for the Java platform)
54
55. JavaSE再入門
java.nio.file
55
publicvoidnio2() throwsIOException {
Path sampleFilePath= Paths.get("sample.txt");
// ファイルの存在チェック
if(!Files.notExists(sampleFilePath)) { return; }
// ファイルの新規作成
sampleFilePath= Files.createFile(Paths.get("sample.txt"));
// ファイルへ書き込み
String content= "line1¥nline2¥n";
Files.write(sampleFilePath, content.getBytes());
// ファイルからすべての行を読み取り
for(String line: Files.readAllLines(sampleFilePath,
Charset.defaultCharset())) {
System.out.println(line);
}
// ファイルが存在している場合は削除
System.out.println(Files.deleteIfExists(sampleFilePath));
}
static メソッドだけで構成されている
便利なFiles ユーティリティクラスが提供
されています。 56. JavaSE再入門
•Java 仮想マシンにおける動的型付け言語のサポート強化
•動的型付け言語が高速に動作するバイトコード命令を追加
•動的言語サポートAPI (java.lang.invoke パッケージ) を追加
•新しい動的リンクメカニズムを提供
•静的な型情報がなくてもメソッド呼び出しの実行が可能
•JIT コンパイラの最適化の恩恵を享受
•Java SE 8 でサポート予定のラムダ式での使用も想定
Java SE 7 の主な変更点2
InvokeDynamic
(Support for dynamically-typed languages)
56
58. JavaSE再入門
•バイナリリテラルを利用可能
(「0b」または「0B」を接頭辞にすることで2 進数を表現)
•数値リテラルにアンダースコアを利用可能(可読性を向上)
•switch 文のcase ラベルに文字列を使用可能
•コンストラクタ呼び出し時の型推論をサポート
(ダイヤモンド演算子)
•リソース管理用構文の追加(try-with-resources)
•例外のマルチキャッチと再スローについての改善
•可変長引数メソッド呼び出しの警告の抑制
(メソッド呼び出し側ではなく宣言側に警告を出力するように変更)
Java SE 7 の主な変更点3
Project Coin (Small language enhancements)
58
59. JavaSE再入門
Project Coin
59
バイナリリテラルを利用可能
数値リテラルにアンダースコアを利用可能
byte b = 0b010101;
short s = 0b010101010101;
int i = 0B010101010101010101010101;
long l = 0B0101010101010101010101010101010101010101L;
byte b = 0b0101_0101;
short s = 0x1F_2E;
int i = 1_234_567_890; 60. JavaSE再入門
Project Coin
switch 文のcase ラベルに文字列を使用可能
publicvoidstringInSwitch() {
Stringtext= "hoge";
switch(text) {
case"fuga":
break;
case"piyo":
break;
default:
break;
}
} 61. JavaSE再入門
Project Coin
61
コンストラクタ呼び出し時の型推論をサポート
publicvoiddiamondOperator() {
// 古い記法
List<String> oldList= newArrayList<String>();
Map<String, Long> oldMap= newHashMap<String, Long>();
List<Map<String, Long>> oldListMap= newArrayList<Map<String, Long>>();
// 新しい記法(ダイヤモンド演算子)
List<String> newList= newArrayList<>();
Map<String, Long> newMap= newHashMap<>();
List<Map<String, Long>> newListMap= newArrayList<>();
} 62. JavaSE再入門
Project Coin
62
リソース管理用構文(try-with-resources) をサポート
// AutoCloseable インタフェースの実装クラス
publicclassMyFileReader implementsAutoCloseable{
@Override
publicvoidclose() throwsException {
System.out.println("Close!");
}
}
publicvoidtryWithResources() {
// セミコロン区切りで複数指定可能
try(MyFileReader auto1= newMyFileReader();
MyFileReader auto2= newMyFileReader()) {
System.out.println("Processing!");
} catch(Exception e) {
e.printStackTrace();
}
} 63. JavaSE再入門
Project Coin
63
例外のマルチキャッチをサポート
publicvoidmultiCatch() {
try{
Field field= String.class.getField("hoge");
System.out.println(field);
// 複数例外を縦棒で区切って指定
} catch(NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
}
eclipseで自動補正可能 64. JavaSE再入門
Project Coin
64
例外の再スローの改善
// Exception 型ではなくより詳細な型を宣言可能
publicvoidrethrow(String name)
throwsNoSuchFieldException, SecurityException{
try{
if(name.equals("First")) {
thrownewNoSuchFieldException();
} else{
thrownewSecurityException();
}
} catch(Exceptione) {
// キャッチしてそのまま再スロー
throwe;
}
}
再スローする例外の型が条件を満たしているかコンパイラが確認 65. JavaSE再入門
•Fork/Join フレームワークを提供
(粒度の小さい並列処理によるマルチコアの有効活用)
•Java Flight Recorder とJava Mission Control を提供(Update 40)
•Unicode 6.0 のサポート
•クラスローダの機能強化(デッドロック問題の解消)
•JDBC 4.1 のサポート
(try-with-resources 文を使用したJDBC リソースの自動解放など)
•便利なユーティリティクラスjava.util.Objects を提供
•JAXP、JAXB、JAX-WS のアップグレード
•Java FX 2.0 をJDK 及びJRE にバンドル
•G1GC 方式のガベージ・コレクションのサポート
Java SE 7 の主な変更点4
65
66. JavaSE再入門
Java Flight Recorder
66
Java Flight Recorder は、JRockit VM に付属するJVM と実行 中のアプリケーションに関する詳細情報を記録ためのツールです。
Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン ドルされています。
JVM 内にメモリなどの稼働状況を監視する機能を内蔵し、それ らが低負荷で動作することより、本番環境での常時記録が可能と なっており、問題発生時に迅速な対応を行うことが可能です。 67. JavaSE再入門
Java Mission Control
67
Java Mission Control は、Java アプリケーションの管理、モニ タリング、プロファイルおよびトラブルシューティングを行うた めのツールスイートです。
Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン ドルされています。
JMX コンソールとJava Flight Recorder から構成されており、 プラグインを簡単にインストールできます。 68. JavaSE再入門
VisualVM とJMC の違い
68
Java VisualVM とJava Mission Control は、非常に よく似たツールですが、いくつかの違いがあります。
Java VisualVM
•プラグインが豊富
•無償で利用可能
Java Mission Control
•基本機能が豊富
•強力な監視機能
•JVMの有償サポートが必要(開発用途での利用は無料) 70. JavaSE再入門
HotSpot JVM のGC
70
J2SE 5.0 以降のHotSpot VM では、エルゴノミクス機能により 実行環境に応じたGC 方式が自動で選択されます。但し、java コマンドのオプションで指定した場合は、その値が優先されます。 GC には、以下のような種類のアルゴリズムが存在します。
GC の種類
特徴
Serial
New 領域およびOld 領域のGC を単一スレッドで実行
シングルプロセッサ環境ではデフォルトで有効
Parallel
New 領域のGC を複数スレッドで実行
Old 領域のGC を単一スレッドで実行
マルチプロセッサ環境ではデフォルトで有効
Concurrent Mark Sweep
New 領域のGC を複数スレッドで実行
Old 領域のGC をアプリケーションスレッドと並列して実行
アプリケーション停止時間は短縮するがスループットは低下
G1
ヒープ領域を細かく細分化し、New 領域やOld 領域に割り当てる方式
アプリケーション停止時間は短縮するがスループットは低下 73. JavaSE再入門
Java SE 8 の主要JSR
JSR
仕様
JSR 114
JDBC Rowsets (JDBC 行セット)
JSR 160
JMX Remote API (JMX リモートAPI)
JSR 173
Streaming API for XML (XML のストリーミングAPI)
JSR 199
Java Compiler API (Java コンパイラAPI)
JSR 206
Java API for XML Processing
(XML データ処理用のJava API)
JSR 221
JDBC 4.0
JSR 269
Pluggable Annotation-Processing API
(プラグイン可能な注釈処理API)
JSR 308
Annotations on types (型アノテーション)
JSR 310
Date and Time API (日付と時刻のAPI)
JSR 335
Lambda expressions (ラムダ式)
73
75. JavaSE再入門
型アノテーション
75
// 型アノテーション
@Target(ElementType.TYPE_USE)
private@interfaceMyChecker{}
// 型使用部分に型アノテーションを付与
@MyChecker
publicstaticclassMyClass extends@MyCheckerObject {
private@MyCheckerString text;
@MyChecker
public<@MyCheckerT> List<T> execute(@MyCheckerT value)
throws@MyCheckerIOException {
@MyCheckerList<@MyCheckerT> list= new@MyCheckerArrayList<>();
list.add(value);
returnlist;
}
}
クラス宣言やメソッド宣言などの宣言部分以外にも、 変数の型やジェネリクスの型パラメータなど、型が使 用されているあらゆるところで使用可能。 76. JavaSE再入門
Checker Framework
76
Java SE 8 には型固有のアノテーションは定義されていませんが、 Checker Framework などの外部ライブラリにより、特定の条件 を検証できるアノテーションが提供されています。また、 Checker Framework 用のEclipse プラグインやMaven プラグ インも提供されています。
例えば、@NonNull アノテーションを型に適用した場合は、コン パイル時にコードパスがnull 値を受け取る可能性があるかどうか を検証できます。 77. JavaSE再入門
•ISO 8601 に準拠した全く新しい日付と時間のAPI (java.time パッケージ) を追加
•日付、時間、日時を扱うクラスをそれぞれ別クラスで提供
•日付演算用の簡単でスレッドセーフ(immutable) なクラス を提供
•Local (タイムゾーンなし)、Offset (UTCからの時差だけを 管理)、Zoned (タイムゾーンあり) の3種類の系統のクラス を提供
•日付と時間のための新しいフォーマッタクラス (java.time.format.DateTimeFormatter) もスレッドセーフ (immutable)
Java SE 8 の主な変更点2
日付と時間のAPI (Date and Time API)
77
79. JavaSE再入門
日付/時間Object の生成と演算
79
publicvoidDateAndTimeSample1() {
// 日付オブジェクトの生成、演算、フォーマット
System.out.println(LocalDate.now());
LocalDatelocalDate= LocalDate.of(2014, 1, 31);
System.out.println(localDate.plusDays(10));
System.out.println(localDate.format(DateTimeFormatter.ISO_DATE));
// 時間オブジェクトの生成、演算、フォーマット
System.out.println(LocalTime.now());
LocalTimelocalTime= LocalTime.of(13, 58);
System.out.println(localTime.minusHours(10));
System.out.println(localTime.format(DateTimeFormatter.ISO_TIME));
// 日時オブジェクトの生成、演算、フォーマット
System.out.println(LocalDateTime.now());
LocalDateTimelocalDateTime= LocalDateTime.of(2014, 1, 31, 13, 58);
System.out.println(localDateTime.plusYears(10));
System.out.println(localDateTime.format(
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
} 80. JavaSE再入門
タイムゾーンのあり/なし
80
publicvoidDateAndTimeSample2() {
// タイムゾーンなし
LocalDateTimelocalDateTime= LocalDateTime.of(2014, 1, 31, 13, 58);
System.out.println(localDateTime);
// UTCからの時差だけを管理
OffsetDateTimeoffsetDateTime=
OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(9));
System.out.println(offsetDateTime);
// タイムゾーンあり
ZonedDateTimezonedDateTime=
ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
System.out.println(zonedDateTime);
}
2014-01-31T13:58
2014-01-31T13:58+09:00
2014-01-31T13:58+09:00[GMT+09:00] 81. JavaSE再入門
•単一メソッドのインタフェースのインスタンス生成を簡単に書 くための新しいシンタックス(簡易記法)
•ラムダ式を使うと、従来よりも短いコードで、処理の流れが明 瞭なコードを記述することが可能
•関数型インターフェースの導入
•メソッド参照、コンストラクタ参照の導入(既存のメソッドや コンストラクタをラムダ式のように使用することが可能)
•仮想拡張メソッド(インタフェースのデフォルト実装) の導入
•Java 8 のラムダ式はクロージャではない(レキシカルスコー プを伴わない)
Java SE 8 の主な変更点3
ラムダ式(Lambda expressions)
81
82. JavaSE再入門
関数型インターフェース
82
関数型インターフェースは、実装するべきメ ソッドが1つしかないインタフェースで、ラムダ 式やメソッド参照のターゲットとなる型です。
java.util.function パッケージで汎用的な関数型 インタフェースがいくつか提供されていますが、 独自に定義することも可能です。
条件に合致すれば関数型インターフェースとし て扱われますが、FunctionalInterface アノテー ションを付与することで明示化し、不適合の場 合にコンパイルエラーとすることもできます。 83. JavaSE再入門
SAM Type
83
SAM Type はSingle-Abstract-Method Type の略で、抽象メソッドを一つだけ持っているク ラスやインターフェースの総称です。
デフォルトメソッドを含む具象メソッドの有無 や個数については問われません。
関数型インターフェースは、SAM Type なイン ターフェースになります。 84. JavaSE再入門
標準の関数型インターフェース
84
種類
概要
インターフェース名
Function
引数を1つまたは2つ受け取って結果を返却 します。
Function
IntFunction
LongFunction
Consumer
引数を1つまたは2つ受け取って結果は返却 しません。
Consumer
IntConsumer
LongConsumer
Supplier
引き数を受け取らず結果を返却します。
Supplier
IntSupplier
LongSupplier
Predicate
引数を1つまたは2つ受け取ってboolean型 の結果を返却します。
Predicate
IntPredicate
LongPredicate
UnaryOperator
引数を1つ受け取って同じ型の結果を返却し ます。
UnaryOperator
IntUnaryOperator
LongUnaryOperator 85. JavaSE再入門
メソッド参照/コンストラクタ参照
85
メソッド参照およびコンストラクタ参照を使用するこ とで、関数型インターフェースのインスタンスを生成 することができます。
既存のメソッドやコンストラクタを特別な表記法で記 述することで、ラムダ式のように使用することが可能 です。
publicstaticvoidmain(String[] args) {
List<String> fruits= Arrays.asList("Apple", "Orange", "Grapes");
// メソッド参照
fruits.stream().filter(s-> s.length() > 2).forEach(System.out::println);
// コンストラクタ参照
Function<char[], String> text= String::new;
System.out.println(text.apply(newchar[]{ 'あ', 'い', 'う'}));
} 86. JavaSE再入門
仮想拡張メソッド
86
仮想拡張メソッドは、インタフェースのメソッ ドにデフォルトの振る舞いを記述できるように するものです。
仮想拡張メソッドの導入により、既存のイン ターフェースにメソッドを追加した場合に、実 装クラスにメソッドのオーバーライドを強要す ることがなくなり、互換性を維持できます。
また、仮想拡張メソッドの導入により、Java でも実質的に多重継承が可能になりました。 87. JavaSE再入門
Default Methods の使用例
87
publicclassDefaultMethodSample {
// デフォルトメソッドを定義したインターフェース
publicinterfaceMyInterface {
defaultString find() {
return"10";
}
}
// 実装クラスでオーバーライド可能
publicstaticclassMyClass implementsMyInterface{
publicString find() {
return"20";
}
}
// オーバーライドしたメソッドの呼び出し
publicstaticvoidmain(String[] args) {
System.out.println(newMyClass().find());
// 20
}
} 88. JavaSE再入門
Static Methods の使用例
88
publicclassStaticMethodSample {
// 静的メソッドを定義したインターフェース
publicinterfaceMyInterface {
publicstaticString find() {
return"10";
}
}
// 静的メソッドの呼び出し
publicstaticvoidmain(String[] args) {
System.out.println(MyInterface.find());
// 10
}
} 89. JavaSE再入門
仮想拡張メソッドの特徴
89
•インターフェースのデフォルトメソッドは、実装ク ラス側でオーバーライド可能
•C++とは異なり、状態の多重継承はできない
(インターフェースではインスタンス変数を保有できないため)
•菱形継承によるメソッド名の重複問題は、呼び出し 順による優先順位付けで解決
•優先順位が判断できない場合は、コンパイルエラー
interfaceA
interfaceB
interfaceC
classD
interfaceB とinterfaceC に同名のデフォルト メソッドが存在する場合はコンパイルエラー。 90. JavaSE再入門
ラムダ式(Lambda Expressions)
90
ラムダ式は、関数型インタフェースの実装匿名クラス の簡易記法です。ラムダ式は以下の構文で記述します。
(引数) -> { 処理}
ラムダ式の引数は、実装する関数型インタフェースの メソッドの引数と同じになります。
ラムダ式導入のメリットは、後述するStream API で ラムダ式を使用することにより、内部イテレータを使 用した並列処理が簡潔に記述可能になることです。 91. JavaSE再入門
ラムダ式の構文
91
基本形
MyFunction func = (int x, int y) -> { return x + y; };
引数の型が自明な場合は引数の型を省略可能
MyFunction func = (x, y) -> { return x + y; };
引数が1つの場合は引数リストの括弧を省略可能
MyFunction func = x -> { return x; };
処理が1文の場合は波括弧とreturn を省略可能
MyFunction func = (x, y) -> x + y; 92. JavaSE再入門
実質的にfinal
92
ラムダ式では匿名クラスと同様に、エンクロージング 環境のローカル変数を参照可能ですが、final 修飾子が 付与されている変数しか参照することができません。
但し、Java SE 8 では、値の変更が行われていない変 数は実質的にfinal として扱われます。
publicstaticvoidmain(String[] args) {
// 実質的final なローカル変数
intvalue1 = 10;
List<Integer> values= Arrays.asList(10, 20, 30);
// ラムダ式
values.stream().
forEach(value2-> System.out.println(value1+ value2));
// 20, 30, 40
} 93. JavaSE再入門
クロージャ(Closure)
93
Closure (関数閉包) は、プログラミング言語における 関数オブジェクトの一種。いくつかの言語ではラムダ 式や無名関数で実現している。引数以外の変数を実行 時の環境ではなく、自身が定義された環境(静的ス コープ)において解決することを特徴とする。関数と それを評価する環境のペアであるともいえる。
(Wikipedia より引用)
Java のラムダ式は、静的スコープ(レキシカルスコー プ) の扱いが制限されている(実質的にfinal な変数に しかアクセスできない) ため、他言語で一般的に「ク ロージャ」と呼ばれている機能とは多少異なります。 94. JavaSE再入門
JavaScript でのClosure 実装例
94
1
2
3
functionouter() {
vari= 0;
i++;
returnfunction() {
returni++;
};
}
varfunc= outer();
print(func());
print(func());
print(func()); 95. JavaSE再入門
ラムダ式とinvokedynamic
95
ラムダ式の実行は、Java SE 7 で導入されたバイト コード命令のinvokedynamic を使用しています。
invokedynamic を使用することにより、ラムダ式の クラスはコンパイル時ではなく実行時に生成されます。
クラスの生成を実行時に行うことで、アプリケーショ ン起動時のクラスロード処理を抑制できるメリットが あります。
Java SE 8 のアプリケーションで頻繁に使用されるで あろうStream API は、ラムダ式により大量のクラス を生成するため恩恵が大きい。 96. JavaSE再入門
•要素のストリームに対する関数型スタイルの操作をサポートす るStream API が追加(コレクションのバルク処理が可能に)
•@Repeatable アノテーションにより、1要素に同じ型の複数 の注釈を付加することが可能に
•リフレクションによるメソッドやコンストラクタの引数情報 (引数名等) の取得が可能に
•Optional 型の導入
•符号付き整数を符号なし整数として取り扱うメソッドをラッ パークラス(Integer, Long クラス等)に追加
•GUI フレームワークとしてJavaFX 8 が統合
(java コマンドによりJavaFX アプリケーションが起動可能)
Java SE 8 の主な変更点4
96
97. JavaSE再入門
•クラスの依存関係を解析するためのjdeps コマンドライン・ ツールを提供
•Java Mission Control 5.4 を提供(細密なデータ分析を可能に する先進的な監視および管理機能を提供)
•Compact プロファイルの導入
(Java SE プラットフォームをサブセット形式で提供可能)
•Base64 のエンコーディング/デコーディングを標準でサポート
•JDBC-ODBC ブリッジが廃止
•Unicode 6.2.0 のサポート
•java.util.concurrent パッケージの更新
(キャッシュ指向の機能拡張やパフォーマンス改善など)
Java SE 8 の主な変更点5
97
98. JavaSE再入門
•java.util.Arrays に配列をパラレルにソートするメソッド (parallelSort) が追加
•高エントロピー乱数生成のサポートが拡張
•IP アドレスレベルに基づいたHTTP URL パーミッション機能 を提供
•Nashorn JavaScript エンジンの導入(「ECMAScript-262 Edition 5.1」に対応した高性能なJavaScript エンジン)
•Hotspot VM とJRockit VM の統合
(Permanent 領域が廃止されHeap 領域へ統合)
•Project Jigsaw (モジュール化) の前準備
Java SE 8 の主な変更点6
98
99. JavaSE再入門
Stream API
99
Stream API は、要素の集まり(配列やコレクションな ど) に対するさまざまな操作を抽象化したAPI です。
ストリームの操作は中間操作と終端操作に分かれ、こ れらを組み合わせてストリーム・パイプラインを形成 します。
中間操作は新しいストリームを返しますが、これらの 操作は常に遅延されます。
ラムダ式を利用したストリームの遅延評価アプローチ によって、マルチコア・プロセッサを効率的に使用す る並列処理の記述が容易になりました。 100. JavaSE再入門
遅延評価(lazy evaluation)
100
遅延評価とは、実際にその値が必要になるまで、その 値に対する計算処理を遅らせるという評価手法の一つ で、関数型言語界隈でよく使用される言葉です。
Java のStream API やラムダ式における遅延評価は、 正確には遅延評価ではなく遅延処理と呼ぶべきもので あるため、安易に遅延評価という言葉は使わないほう が良さそうです。
遅延処理には、遅延リストを使用した無限リストの取 り扱いが可能になる、本来必要のない無駄な計算を省 けるなどのメリットがあります。 101. JavaSE再入門
Stream の生成
101
ストリームのインスタンスは、配列やCollection などから生成 することが可能です。
publicvoidcreateStream() {
// 配列から生成
String[] array= { "あ", "い", "う", "え", "お"};
Stream<String> arrayStream= Arrays.stream(array);
arrayStream.forEach(System.out::println);
// リストから生成
List<String> list= Arrays.asList("か", "き", "く", "け", "こ");
Stream<String> listStream= list.stream();
listStream.forEach(System.out::println);
// ストリームを結合して生成
Stream<String> concatStream=
Stream.concat(Arrays.stream(array), list.stream());
concatStream.forEach(System.out::println);
// 範囲を指定してint のストリームを生成
IntStream intStream= IntStream.range(0, 5);
intStream.forEach(System.out::println);
} 102. JavaSE再入門
Stream の中間操作
102
ストリームに対して、以下のような中間操作が可能です。 戻り値は全てストリームです。
中間操作
概要
filter
指定された条件に一致するものを抽出します。
map
ストリームの各要素に指定された関数を適用した結果を返します。
flatMap
ストリームの各要素に指定された関数を適用した結果得られたスト リームを纏めたストリームを返します。
distinct
Object.equals(Object) による重複を除いた要素を抽出します。
sorted
ストリームの各要素をソートした結果を返します。
peek
ストリームをそのまま返します。デバッグ用途などで、各要素に対し て副作用を伴う処理を実行する場合に使用します。
limit
要素を指定された最大サイズ以内の長さに切り詰めた結果を返します。
skip
指定された最初のn 個の要素を破棄した結果を返します。 103. JavaSE再入門
順次ストリーム/並列ストリーム
103
ストリームには、順次ストリームと並列ストリームの 2 種類のストリームが存在します。
順次ストリーム(Sequential Stream)
ストリームの各要素を順番に実行します。
並列ストリーム(Parallel Stream)
ストリームの各要素を並列で実行します。
Stream<Integer> sequentialStream= Arrays.asList(1, 2, 3).stream();
sequentialStream.forEach(System.out::println);
// 1, 2, 3
Stream<Integer> parallelStream= Arrays.asList(1, 2, 3).parallelStream();
parallelStream.forEach(System.out::println);
// 2, 3, 1 104. JavaSE再入門
Stateless/Statefullな操作
104
ストリームの中間操作には、ステートレス操作とステー トフル操作の2 種類の操作が存在します。
ステートレス操作(Stateless Operation)
ステートレス操作(filter, map, flatMap) は、各要素を処理する際に、 他の要素の影響を受けない操作です。ステートレスな中間操作のみを含 むパイプラインは、順次処理、並列処理のいずれであっても、最小限の データ・バッファリングで単一パスで処理できます。
ステートフル操作(Statefull Operation)
ステートフル操作(distinct, sorted, limit, skip) は、各要素 を処理する際に、他の要素の影響を受ける操作です。その為、 ステートフルな中間操作を並列処理で行った場合は、処理効率 が悪化する可能性があるので注意が必要です。 105. JavaSE再入門
Stream の終端操作
105
ストリームに対して、以下のような終端操作が可能です。 複数回の終端操作を行うと例外が発生します。
終端操作
概要
forEach
ストリームの各要素に対してアクションを実行します。
toArray
ストリームの要素を含む配列を返します。
reduce
ストリームの要素に対してリダクション操作を実行します。
collect
ストリームの要素に対して可変リダクション操作を実行します。
min
指定されたComparatorに従ってストリームの最小要素を返します。
max
指定されたComparatorに従ってストリームの最大要素を返します。
count
ストリームの要素数を返します。
anyMatch
条件に一致する要素が存在する場合にtrue を返します。
allMatch
全ての要素が条件に一致する場合にtrue を返します。
noneMatch
全ての要素が条件に一致しない場合にtrue を返します。 106. JavaSE再入門
リダクション操作(折りたたみ)
106
リダクション操作は、一連の入力要素に対して結合操作を繰り返し、 単一のサマリー結果を返却します。リダクション操作は、順次に実 行することも並列に実行することもできます。Java では可変リダク ション操作のためのCollectorインターフェースが提供されており、 Collector の仕様を決定する4つの関数を返却する以下のメソッドが 定義されています。
メソッド名
戻り値の型
戻り値
supplier
Supplier<A>
新しい可変結果コンテナを返す関数
accumulator
BiConsumer<A,T>
可変結果コンテナに値を折りたたむ関数
combiner
BinaryOperator<A>
2つの部分的な結果を結合して1つの合成 結果を作成する関数
finisher
Function<A,R>
中間結果を最終結果に変換する関数
また、Stream インタフェースには、Collector を使ってストリーム の要素に対する可変リダクション操作を実行するためのcollect メ ソッドが定義されています。 107. JavaSE再入門
Collectors クラス
107
Java では、各種のリダクション操作を実装したクラスを返却する メソッドを多数持つユーティリティクラス (java.util.stream.Collectors) が提供されています。Collectors クラスには、以下のようなメソッドが多数存在します。
メソッド
概要
averagingLong
入力要素の算術平均を生成するCollector を返します。
counting
入力要素の数をカウントするCollector を返します。
groupingBy
入力要素に対するグループ化操作を実装したCollector を返します。
joining
入力要素を検出順に連結して1つの文字列にするCollector を返します。
maxBy
指定されたComparator に従って最大要素を生成するCollector を返します。
minBy
指定されたComparator に従って最少要素を生成するCollector を返します。
partitioningBy
入力要素を分割し、結果をMap 内に格納するCollector を返します。
toCollection
入力要素を検出順に新しいCollection 内に蓄積するCollector を返します。
toList
入力要素を新しいList に蓄積するCollector を返します。
toMap
Map 内に要素を累積するCollector を返します。 108. JavaSE再入門
Stream API の実装例
108
// 要素数のカウント
Stream<String> stream1= Stream.of("あ", "い", "う", "え", "お");
System.out.println(stream1.collect(Collectors.counting()));
// 5
// 要素の連結
Stream<String> stream2= Stream.of("か", "き", "く", "け", "こ");
System.out.println(stream2.collect(Collectors.joining(",")));
// か,き,く,け,こ
// 要素を切り詰めてリストへ変換
Stream<Integer> stream3= Stream.of(1, 2, 3, 4, 5);
List<Integer> list= stream3.limit(3).collect(Collectors.toList());
System.out.println(list);
// [1, 2, 3]
// 偶数の要素を抽出して最大値を取得
Stream<Integer> stream4= Stream.of(1, 2, 3, 4, 5);
System.out.println(stream4.filter(s-> s% 2 == 0).max((s1, s2) -> s1-s2));
// Optional[4] 109. JavaSE再入門
Repeating Annotations
109
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyAnnotations.class)
public@interfaceMyAnnotation{
String value();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceMyAnnotations{
MyAnnotation[] value();
}
@MyAnnotation("hoge")
@MyAnnotation("fuga")
publicstaticclassMyClass {
publicvoidprint() {
MyAnnotationsannotations=
MyClass.class.getDeclaredAnnotation(MyAnnotations.class);
Arrays.stream(annotations.value()).forEach(System.out::println);
}
}
1要素に同じ型の複数の注釈を付加 110. JavaSE再入門
Optional
110
Optional は、T 型の値を一つだけ保持できる イミュータブルなコンテナクラスです。
null の可能性のある値をラップすることにより null チェックの冗長な記述を排除可能で、基本 データ型用のOptionalInt、OptionalDouble、 OptionalLong クラスも提供されています。
Stream API には、Optional 型を返す終端メ ソッドが多数存在するため、流れるように処理 を記述できます。 111. JavaSE再入門
Optional の使用例
111
importjava.util.Optional;
publicclassOptionalSample {
publicstaticclassMyClass {
// Optional 型を返却するメソッド
publicstaticOptional<String> getHoge(String value) {
// null の場合は空のOptional を返却
returnOptional.ofNullable(value);
}
}
publicstaticvoidmain(String[] args) {
System.out.println(MyClass.getHoge("あ").orElse("い"));
System.out.println(MyClass.getHoge(null).orElseGet(() -> "う"));
MyClass.getHoge("え").ifPresent(hoge-> System.out.println(hoge));
}
}
あ
う
え 112. JavaSE再入門
JavaFX
112
JavaFX は、JVM 上で動作するGUI アプリケー ションのプラットフォームです。
ハードウェアアクセラレーション対応の軽量Java UI プラットフォームを提供する目的で設計されて おり、Swing アプリケーション内でJavaFX を使 用して、既存のプリケーションを拡張することも可 能です。
標準技術であるXML (FXML) やCSS を使用した スタイリングが可能で、JavaFX Scene Builder と 言うGUI ツールが無償で提供されています。 113. JavaSE再入門
JavaFXSample
113
Oracle 社のJava SE Downloads サイトから、サ ンプルアプリケーションのダウンロードが可能です。
http://www.oracle.com/technetwork/java/javase/downloads/index.html 114. JavaSE再入門
Compact Profiles
114
Compact Profiles は、実行環境のROM/RAM サ イズに応じたプラットフォームを選択可能にするも ので、縮小版のrt.jar を含んだJRE です。
サブセット形式での提供により、JVM 起動時間の 短縮、リソース使用量の削減が可能です。
Compact 1
(11MB)
Core, Security, Networking, Date and Time, IO, Collections, JNI, …
Compact 2
(15MB)
JDBC, RMI,
XML, JAXP
Compact 3
(21MB)
Security, JMX, JNDI, XML, JAXP2, Management, …
Full
(163MB)
Beans, IDL, CORBA, Java 2D, Sound, Swing, AWT, Image I/O, JAX-WS, … 115. JavaSE再入門
JavaScript の実行
115
publicstaticvoidmain(String[] args) {
ScriptEngineManagermanager= newScriptEngineManager();
ScriptEngineengine= manager.getEngineByName("js");
System.out.println("engine = "+ engine);
try{
// 指定されたスクリプトの実行
engine.eval("print('Hello, World');");
engine.eval("function sum(a, b) { return a + b; }");
// 関数の呼び出し
Invocableinv= (Invocable) engine;
System.out.println(inv.invokeFunction("sum", 10, 20));
} catch(ScriptException | NoSuchMethodException e) {
e.printStackTrace();
}
}
engine = jdk.nashorn.api.scripting.NashornScriptEngine@4524411f
Hello, World
30
コマンドラインからjjs コマンドでjs ファイルを実行することも可能です。 116. JavaSE再入門
Hotspot VM とJRockit VM の統合
116
Oracle社がBEA Systems 社とSun Microsystems 社を買収し たことにより、Oracle社は2つのJVM 実装を保有することにな りました。
Oracle 社では、多数のプラットフォームに対応し、利用者数の多 いHotspot VM と、Intel CPU とサーバーサイド用途に最適化さ れたJRockit VM を統合し、より優れたJVM を提供することを目 標としているそうです。
JavaSE8では、その一環として、JRockit VM 側に存在しなかっ たPermanent 領域がHotSpot VM から削除されています。
ヒープ領域の一種であるPermanent 領域がMetaspace と呼ばれ るNative メモリ領域に変更されることにより、DI による大量の メタデータ格納時などに発生するPermanent 領域不足が原因の OutOfMemoryError から解放されます。 118. JavaSE再入門
Application Server のJava SE サポート状況
Application Server 名称
サポート状況
Oracle WebLogic Server 12c
Java SE 6, Java SE 7
IBM WebSphere Application Server V.8.5
Java SE 6, Java SE 7
Red Hat JBoss EAP 6.3
Java SE 7
FUJITSU Interstage Application Server V11.0
Java SE 6, Java SE 7
Hitachi uCosminexus Application Server V9
Java SE 7
NEC WebOTX Application Server V9.2
Java SE 7
Oracle GlassFish Server 3.1.2
Java SE 6, Java SE 7
GlassFish 4.1 Open Source Edition
Java SE 7, Java SE 8
WildFly 8 (旧JBoss Application Server)
Java SE 7, Java SE 8
Apache Tomcat 8.0
Java SE 7, Java SE 8
Jetty 9.2
Java SE 7, Java SE 8
118
(2014年9月10日時点) 119. JavaSE再入門
ECJ (Eclipse Compiler for Java)
119
Eclipse のJava 開発環境であるJDT (Eclipse Java development tools) が使用しているコンパイラは、 OpenJDK やOracleJDK ではなく、Eclipse が独自実 装しているECJ (Eclipse Compiler for Java) です。
ECJ は、OracleJDK などに比べるとコンパイラによる チェックが緩い傾向があります。その為、Eclipse で コンパイルが成功しても、ビルドツールを使用したコ ンパイルでは失敗する可能性があります。
開発環境でのビルドツールの使用と、CI サーバによる 定期監視により、適切なリソース管理を行うことが可 能になります。 120. JavaSE再入門
Java のビルドツール
No
ビルドツール
概要
1
Apache Ant + Apache Ivy
Apache Ant は、最も古くから存在するビルドツールで、 XML 形式でビルドルールを記述することが特徴です。依 存性管理ツールであるApache Ivy と組み合わせて使用 することが可能です。
2
Apache Maven
Apache Maven は、Ant に代わるものとして作られたプ ロジェクト管理ツールです。プラグインによる拡張が可 能で、統一したビルドプロセスの提供、依存ライブラリ の管理が可能です。Antと同様にXML 形式(pom.xml) でプロジェクト情報を記述します。
3
Gradle
Gradle は、JVM 環境における汎用ビルドツールです。 XML 形式ではなく、Groovy ベースのDSL によってス クリプトを記述することにより柔軟性を高めています。 Maven/Ivy リポジトリへのアクセスや、Ant タスクの呼 び出しも可能な次世代のビルドツールです。
120
121. JavaSE再入門
Java 関連のお勧め書籍
121
タイトル: Java逆引きレシピ
出版社: 翔泳社
著者: 竹添直樹, 高橋和也
織田翔, 島本多可子
発売日: 2014/4/22
ページ数: 576ページ
価格: 3,024円(税込)
タイトル: Effective Java 第2版
出版社: 丸善出版
著者: Joshua Bloch (著)
柴田芳樹(翻訳)
発売日: 2014/3/11
ページ数: 327ページ
価格: 3,888円(税込) 122. JavaSE再入門
Java SE9
122
2016年にリリース予定で、以下の機能を提供予定?
JEP
仕様
JEP 102
Process API Updates
オペレーティングシステムプロセスを制御し、管理するためのAPIを改善
JEP 110
HTTP 2 Client
レガシーなHttpURLConnection に代わる新たなHTTP クライアントで、 HTTP 2.0 とWebSocket を実装
JEP 197
Segmented Code Cache
パフォーマンスの向上と将来の拡張のために、コードのキャッシュを分割
JEP 198
Light-Weight JSON API
JSON データの生成と読み込みを行うライトウェイトAPI を提供
JEP 199
Smart Java Compilation, Phase Two
Smart Java コンパイラの改善
JEP 200
The Modular JDK
JDK のモジュール構造を定義
JEP 201
Modular Source Code
JDK ソースコードをモジュールへ再編成し、ビルドシステムを改良します
Project Jigsaw 125. JavaSE再入門
•コードが冗長になりがち
•NPE、ヌルポ
•互換性を重要視するがゆえに言語の進化のス ピードが遅い
•膨大な数のライブラリやフレームワークが存 在するがゆえに取捨選択が必要
•メジャー言語であるがゆえにプログラマのス キルの差が激しい
•若者のJava 離れが顕著
Java の良くないところ
125