java se 再入門
DESCRIPTION
Java SE Re-IntroductionTRANSCRIPT
Java SE 再入門
To Java SE 8 from J2SE 1.4
September 2014
@minazou67
Java SE 再入門
はじめに
本スライドは、J2SE 1.4 から Java
SE 8 の新機能について広く浅く解説し、
短時間で Java SE に関する知識を網羅
的に学習することを目的としています。
Java を学ぶきっかけになれば幸いです。
2
• 本スライドでは、Java の基本的な事項 (変数、演算子、制御構文、クラスなど) については取り扱いません。
• 本スライドで紹介している機能が、Java SE の新機能の全てではありません。
• 本スライドに掲載されている会社名、製品名、サービス名、ロゴは、各社・各団体の商標または登録商標です。
Java SE 再入門
Target
• Java の知識が Java SE 6
付近で止まっている人
• Java 使ってるけど、実は
よく知らないという人
• Java 初心者な人
3
Java SE 再入門
Goal
Java SE の各バージョンの更新内容
を再確認することにより、既存の知
識を整理すると共に、最新バージョ
ンの Java SE について学び、より
モダンなプログラミングスタイルを
身に付けましょう。
4
Java SE 再入門
Java に関する
あれやこれや
5
Java SE 再入門
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
Java SE 再入門
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
Java SE 再入門
JRE (Java Runtime Environment)
Java 実行環境
Java 仮想マシン (JVM) と実行時ライブラリのセット
JDK (Java Development Kit)
Java 開発キット
開発ツール群と開発ツールが使用する非公開 JRE のセット(非公開 JRE は、開発ツールの実行のためだけに存在します。)
Java 関連用語 2
8
Java SE 再入門
JVM (Java Virtual Machine)
Java 仮想マシン
コンパイラが生成する Java バイトコードをプラットフォーム固有のネイティブコードに変換して実行するソフトウェア
Java 関連用語 3
9
Java バイトコード (Java byte code)
Java 仮想マシン用の命令セット
ターゲットマシンのアーキテクチャに依存することなく実行速度を向上させるための中間コード
Java SE 再入門
JNI (Java Native Interface)
他言語との相互運用のためのインタフェース仕様
Java から他言語で作成したライブラリのネイティブメソッドを呼び出すことが可能、またその逆も可能
Java 関連用語 4
10
JNDI (Java Naming and Directory Interface)
ネーミグサービスやディレクトリサービスを参照するためのインタフェース仕様
LDAP や DNS, RMI, DataSource のようなサービスに対応
Java SE 再入門
リファレンス実装 (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
Java SE 再入門
• オブジェクト指向プログラミング言語
• 強い静的型付け言語
• Write Once, Run Anywhere (Platform 非依存)
• コンパイラにより Java バイトコードを生成
• Java 仮想マシン (JVM) の上で動作
• ガベージコレクションによるメモリ管理
• C 言語ライクな構文
• マルチスレッドをサポート
• 高い互換性 (ソース・バイナリ・プラットフォーム)
Java の特徴
12
Java SE 再入門
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
Java SE 再入門
JVM の実装
14
Java HotSpot VMJust-In-Time(JIT)コンパイルが特徴の JVM
Sun Microsystems 社が開発・提供していた JVM で、現在は Oracle 社が提供・サポートしています。OpenJDK の JVM の基盤となっており、Mac でも動作可能です。
Oracle JRockit JVMIntel CPU, サーバーサイド用途に最適化された JVM
BEA Systems 社が開発・提供していた WebLogic Server 付属の JVMで、現在は Oracle 社が提供・サポートしています。
その他IBM 社製の IBM J9 VM や 富士通社製の FJVM、日立社製の独自の Java VM など多数の実装が存在しています。
Java SE 再入門
JVM の起動モード
15
Client Modeクライアントアプリケーション用に最適化され、起動時間が短くなり、メモリーフットプリントが減少
64bit 版の JDK では、このオプションを無視し、代わりに server モードが選択されます。
Server Modeサーバーアプリケーション用に最適化され、起動時間は長くなるが、スループットが向上
マルチプロセッサで且つ、物理メモリが 2GB 以上あるとサーバークラスマシンとして検出され、 server モードで起動されます。
Java SE 再入門
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
Java SE 再入門
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
Java SE 再入門
J2SE 1.4(JSR 59)
18
Java SE 再入門
• 2002年2月6日にリリース
• コードネームは Merlin
• 2008年10月に EOL
• 「Java Community Process (JCP)」のもとで開発された初めての Java プラットフォーム
• 言語仕様が大幅に拡張され、多数の新機能が追加された
• テーマは、信頼性、保守性、スケーラビリティ、パフォーマンス、配備
J2SE 1.4 概要
19
Java SE 再入門
J2SE 1.4 の主要 JSRJSR 仕様
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
Java SE 再入門
• アサーション機能の提供
• 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
Java SE 再入門
• 標準のロギング 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
Java SE 再入門
アサーション (表明) は、プログラムが仕様通りに正しく動作し
ているかを検証するための機能です。
以下のように、assert ステートメントで表明します。
Assertion
23
assert Expression1 ;assert Expression1 : Expression2 ;
式1 は boolean 型の式で、false の場合に AssertionError が発
生します。式2 はエラーの詳細メッセージを返す任意の式です。
java コマンドに「-ea」オプションを指定して実行するとアサー
ションが有効になります。
Java SE 再入門
Assertion の実装例
24
public static void verify() {int i = 1;// 詳細メッセージなしassert i == 1;System.out.println("1");// 詳細メッセージありassert i == 2 : "i = " + i;System.out.println("2");
}
1Exception 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)
Java SE 再入門
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 ファイルを指定可能
Java SE 再入門
Java Logging API の使用例
26
import java.util.logging.Logger;
public class LoggingSample {
public static void main(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情報: info2014/09/09 14:34:09 com.sample.se4.LoggingSample main警告: warning2014/09/09 14:34:09 com.sample.se4.LoggingSample main致命的: severe
Java SE 再入門
J2SE 5.0(JSR 176)
27
Java SE 再入門
• 2004年9月30日にリリース
• コードネームは Tiger
• 2009年10月に EOL
• 言語仕様が大幅に拡張され、多数の新機能が追加された
• テーマは、信頼性・可用性・保守性、パフォーマンスとスケーラビリティ、開発容易性、デスクトップクライアント
J2SE 5.0 概要
28
Java SE 再入門
J2SE 5.0 の主要 JSR 1JSR 仕様
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
Java SE 再入門
J2SE 5.0 の主要 JSR 2JSR 仕様
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
Java SE 再入門
• BigDecimal クラスの強化による小数点演算の強化
(固定精度の浮動小数点計算をサポート)
• 総称型 (Generics) の追加による、コンパイラのタイプセーフ検証の強化 (キャスト作業の省略と型安全)
• アノテーション (注釈) によるメタデータ機能の追加
(ボイラープレートコードの自動生成が可能)
• 列挙型 (enum)、オートボクシング・アンボクシング 、拡張for 文、静的インポート、可変長引数による拡張
• Unicode 4.0 および補助文字のサポート
• JAR ファイルを高圧縮する新しい Pack200 形式をサポート
(JAR ファイルのダウンロードサイズを大幅に削減)
J2SE 5.0 の主な変更点 1
31
Java SE 再入門
• 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
Java SE 再入門
ジェネリクスは、汎用的な型を取り扱うクラスやインター
フェースに型パラメータリスト (型変数) を記述し、インス
タンス化する際に型変数に型を与えることにより、コンパ
イル時に型を保障しながら汎用的な型を取り扱うための仕
組みです。型変数はメソッドの宣言に対しても指定するこ
とができます。
メジャーな実装例としては、コレクション API
(java.util.List や java.util.Map) が挙げられ、コードが型
安全になることにより、実行時の ClassCastException が
抑制できます。
総称型 (Generic type)
33
Java SE 再入門
public class GenericSample {
public static class MyClass<K, V> {private K key;private V value;public void setKeyValue(K key, V value) {
this.key = key;this.value = value;
}public K getKey() { return key; }public V getValue() { return value; }
}
public static void main(String[] args) {MyClass<String, String> mc = new MyClass<String, String>();mc.setKeyValue("1", "hoge");String key = mc.getKey();System.out.println("key = " + key);
}}
総称型の実装例
34
型パラメータリスト
インスタンス生成時に型を指定
Java SE 再入門
アノテーションはコードに付加するメタデータで、パッ
ケージやクラス、メソッド、フィールドなどに適用するこ
とができます。アノテーションは、プログラムの動作に影
響を与えません。
コードにメタデータを付加することの最大のメリットは、
コンパイラがメタデータを解釈することにより、コンパイ
ル時に様々なチェックが可能になると言う点です。また、
外部の解析ツールやライブラリなどがメタデータを解釈す
ることにより、コードやドキュメントの自動生成、DI など
が実現可能となります。
注釈 (Annotation)
35
Java SE 再入門
以下のような標準アノテーション型が提供されています。
標準 Annotation
36
Override
メソッドをオーバーライドしていることを明示する注釈
メソッドに対してのみ使用可能
Deprecated
非推奨であることを明示する注釈
非推奨のプログラム要素が使用されている場合に、コンパイラ警告とすることが可能
SuppressWarnings
コンパイラ警告を抑制する注釈
以前のバージョンで書かれたコードに対して有効
Java SE 再入門
列挙した名前付き定数の集まりで構成されるクラスです。型安全
に特定データの集まりを扱えます。独自メソッドも定義可能です。
列挙型 (Enum)
37
public class EnumSample {
enum Fruit { APPLE, ORANGE, GRAPE }
public static void main(String[] args) {
Fruit fruit = Fruit.ORANGE;
if (fruit == Fruit.GRAPE) {System.out.println("fruit is " + Fruit.GRAPE);} else {
System.out.println("fruit is not " + Fruit.GRAPE);}
}}
Java SE 再入門
基本データ型とラッパークラスの相互自動型変換機能です。
Autoboxing
38
public void autoboxing() {
List<Integer> list = new ArrayList<Integer>();
// 古い記法list.add(new Integer(1));int x = list.get(0).intValue();// 新しい記法list.add(2);int y = list.get(1);
System.out.println("x = " + x);System.out.println("y = " + y);
}
Java SE 再入門
for 文から Iterator を除去し簡素化する記述方法です。
拡張 for 文
39
public void expansionLoop(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);}
}
Java SE 再入門
静的変数や静的メソッドをクラス名を記述せずに使用できるよう
にする機能です。
Static Import
40
// 静的インポートimport static java.lang.Math.*;
public class StaticImportSample {
public static void main(String[] args) {// 古い記法System.out.println("cos(PI) = " + Math.cos(Math.PI));// 新しい記法System.out.println("cos(PI) = " + cos(PI));
}}
Java SE 再入門
可変個数の引数を持つメソッドを定義可能になりました。
可変長引数
41
public class VariableLengthArgumentSample {
// 可変長引数のメソッドpublic static void variableLengthArgument(String... args) {
for (String arg : args) {System.out.println(arg);
}}
public static void main(String[] args) {variableLengthArgument("hoge", "fuga");
}}
Java SE 再入門
Java SE 6(JSR 270)
42
Java SE 再入門
• 2006年12月11日にリリース
• コードネームは Mustang
• 2013年2月に EOL
• 名称が J2SE から Java SE に変更され、バージョン番号から小数点以下が削除された
• 大幅な言語仕様の変更はないが、多数の新機能の追加や管理機能の強化、安定性の向上などが行われた
• テーマは、互換性、開発容易性、診断機能・監視と管理、エンタープライズデスクトップ、XML & Web サービス、透明性
Java SE 6 概要
43
Java SE 再入門
Java SE 6 の主要 JSRJSR 仕様
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
Java SE 再入門
• 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
Java SE 再入門
• 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
Java SE 再入門
• コアライブラリの改善
(String クラスへの isEmpty メソッドの追加など)
• Java プログラムからソースコードのコンパイルが可能となるCompiler API を提供
• 軽量 HTTP サーバをバンドル
(com.sun.net.httpserver パッケージ)
• G1GC 方式のガベージ・コレクションを実験的に導入
• Java Quick Starter の導入 (バイトコード共有など)
• 次世代 Java Plug-in の導入
• Direct3D (ハードウェアアクセラレーション) のサポート
Java SE 6 の主な変更点 3
47
Java SE 再入門
Java DBは、オラクル社がサポートしている Apache Derby の
ディストリビューションで、JDK 6 から標準でバンドルされてい
ます。 Apache Derby は、全て Java で実装されているオープン
ソースのリレーショナルデータベース管理システム(RDBMS)
で、以下の特徴があります。
Java DB
48
• コンパクトなサイズ (約 2.5MB)
• SQL や JDBC API、Java EE テクノロジを完全にサポート
(分散トランザクションやストアドプロシージャ、JNDI などをサポート)
• 組み込みモードで動作させることで、アプリケーションへの組み込みが可能
• サーバモードで動作させることで、ネットワーク経由での複数同時接続が可能
• ij (SQL発行用のコマンドラインツール) を使用して、バックアップなどの管理作業が可能
Java SE 再入門
Java VisualVMは、JVM 上で実行されている Java アプリケー
ションのモニタリングやプロファイリング、トラブルシューティ
ングを行うための GUI ツールです。
JConsole、jstat、jinfo、jstack などの既存のスタンドアロンツー
ルを連携させて JVM からデータを取得し、それらの情報を編集し
て画面に表示します。プラグインによる機能追加も可能です。
Java VisualVM
49
Java SE 再入門
Java SE 6 は、 HTTP と HTTPS をサポートしたシンプルなHTTP Server API を提供しています。
Java HTTP Server API
50
public class HTTPServerSample {// HttpHandler の実装クラスstatic class SampleHandler implements HttpHandler {
public void handle(HttpExchange exchange) throws IOException {String response = "Hello World";exchange.sendResponseHeaders(200, response.length());OutputStream ost = exchange.getResponseBody();ost.write(response.getBytes());ost.close();
}}public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);server.createContext("/sample", new SampleHandler());server.setExecutor(null);server.start();
}}
Java SE 再入門
Java SE 7(JSR 336)
51
Java SE 再入門
• 2011年7月28日にリリース
• コードネームは Dolphin
• 2015年4月に EOL
• Project Coin による多数の言語仕様の改善や新規ファイルシステム API の提供、動的言語のサポート強化などが行われた
• リファレンス実装が Sun JDK から OpenJDK へ変更された
• テーマは、互換性、生産性、パフォーマンス、普遍性、統合
Java SE 7 概要
52
Java SE 再入門
Java SE 7 の主要 JSRJSR 仕様
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
Java SE 再入門
• 新規ファイルシステム 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
Java SE 再入門
java.nio.file
55
public void nio2() throws IOException {
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 ユーティリティクラスが提供されています。
Java SE 再入門
• Java 仮想マシンにおける動的型付け言語のサポート強化
• 動的型付け言語が高速に動作するバイトコード命令を追加
• 動的言語サポート API (java.lang.invoke パッケージ) を追加
• 新しい動的リンクメカニズムを提供
• 静的な型情報がなくてもメソッド呼び出しの実行が可能
• JIT コンパイラの最適化の恩恵を享受
• Java SE 8 でサポート予定のラムダ式での使用も想定
Java SE 7 の主な変更点 2
InvokeDynamic(Support for dynamically-typed languages)
56
Java SE 再入門
• invokestatic (静的メソッドの呼出し)
• invokevirtual (クラスのメソッドの呼び出し)
• invokeinterface (インターフェイスのメソッドの呼び出し)
• invokespecial (コンストラクタ、プライベートメソッドの呼び出し)
JVM のメソッド呼出し
57
既存のバイトコード命令 (Java 用に最適化)
追加されたバイトコード命令(動的言語用に最適化)
• invokedynamic (動的型付け言語向けのメソッドの呼び出し)
• 命令に紐付く処理を言語処理系が独自に選択可能
• 命令に紐付く処理を実行時に変更可能
Java SE 再入門
• バイナリリテラルを利用可能
(「0b」または「0B」を接頭辞にすることで 2 進数を表現)
• 数値リテラルにアンダースコアを利用可能 (可読性を向上)
• switch 文の case ラベルに文字列を使用可能
• コンストラクタ呼び出し時の型推論をサポート
(ダイヤモンド演算子)
• リソース管理用構文の追加 (try-with-resources)
• 例外のマルチキャッチと再スローについての改善
• 可変長引数メソッド呼び出しの警告の抑制
(メソッド呼び出し側ではなく宣言側に警告を出力するように変更)
Java SE 7 の主な変更点 3
Project Coin (Small language enhancements)
58
Java SE 再入門
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;
Java SE 再入門
Project Coin
switch 文の case ラベルに文字列を使用可能
public void stringInSwitch() {String text = "hoge";switch (text) {case "fuga":
break;case "piyo":
break;default:
break;}
}
Java SE 再入門
Project Coin
61
コンストラクタ呼び出し時の型推論をサポート
public void diamondOperator() {
// 古い記法List<String> oldList = new ArrayList<String>();Map<String, Long> oldMap = new HashMap<String, Long>();List<Map<String, Long>> oldListMap = new ArrayList<Map<String, Long>>();
// 新しい記法 (ダイヤモンド演算子)List<String> newList = new ArrayList<>();Map<String, Long> newMap = new HashMap<>();List<Map<String, Long>> newListMap = new ArrayList<>();
}
Java SE 再入門
Project Coin
62
リソース管理用構文 (try-with-resources) をサポート
// AutoCloseable インタフェースの実装クラスpublic class MyFileReader implements AutoCloseable {
@Overridepublic void close() throws Exception {
System.out.println("Close!");}
}
public void tryWithResources() {// セミコロン区切りで複数指定可能try (MyFileReader auto1 = new MyFileReader();
MyFileReader auto2 = new MyFileReader()) {System.out.println("Processing!");
} catch (Exception e) {e.printStackTrace();
}}
Java SE 再入門
Project Coin
63
例外のマルチキャッチをサポート
public void multiCatch() {try {
Field field = String.class.getField("hoge");System.out.println(field);
// 複数例外を縦棒で区切って指定} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();}
}
eclipseで自動補正可能
Java SE 再入門
Project Coin
64
例外の再スローの改善
// Exception 型ではなくより詳細な型を宣言可能public void rethrow(String name)
throws NoSuchFieldException, SecurityException {
try {if (name.equals("First")) {
throw new NoSuchFieldException();} else {
throw new SecurityException();}
} catch (Exception e) {// キャッチしてそのまま再スローthrow e;
}}
再スローする例外の型が条件を満たしているかコンパイラが確認
Java SE 再入門
• 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
Java SE 再入門
Java Flight Recorder
66
Java Flight Recorder は、JRockit VM に付属する JVM と実行
中のアプリケーションに関する詳細情報を記録ためのツールです。
Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン
ドルされています。
JVM 内にメモリなどの稼働状況を監視する機能を内蔵し、それ
らが低負荷で動作することより、本番環境での常時記録が可能と
なっており、問題発生時に迅速な対応を行うことが可能です。
Java SE 再入門
Java Mission Control
67
Java Mission Control は、Java アプリケーションの管理、モニ
タリング、プロファイルおよびトラブルシューティングを行うた
めのツールスイートです。
Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン
ドルされています。
JMX コンソールと Java Flight Recorder から構成されており、
プラグインを簡単にインストールできます。
Java SE 再入門
VisualVM と JMC の違い
68
Java VisualVM と Java Mission Control は、非常に
よく似たツールですが、いくつかの違いがあります。
Java VisualVM
• プラグインが豊富
• 無償で利用可能
Java Mission Control
• 基本機能が豊富
• 強力な監視機能
• JVMの有償サポートが必要 (開発用途での利用は無料)
Java SE 再入門
java.util.Objects
69
静的メソッドのみで構成されている便利なユーティリ
ティークラスが提供されました。
http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html
Java SE 再入門
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 領域に割り当てる方式
アプリケーション停止時間は短縮するがスループットは低下
Java SE 再入門
Java SE 8(JSR 337)
71
Java SE 再入門
• 2014年3月18日にリリース
• コードネームは存在しない
• 2017年3月に EOL 予定
• ラムダ式の導入や新しい JavaScript エンジンの導入、JavaFX の統合などが行われた
• Compact プロファイルの導入により、Java SE プラットフォームをサブセット形式で提供可能になった
• テーマは存在しない
Java SE 8 概要
72
Java SE 再入門
Java SE 8 の主要 JSRJSR 仕様
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
Java SE 再入門
• 型アノテーションにより、宣言部に限らず、型が使用される任意の場所にアノテーションを適用可能
• java.lang.annotation.ElementType にTYPE_PARAMETER (型パラメータ宣言) とTYPE_USE (型使用箇所) が追加
• 型チェック・フレームワークをコンパイラのプラグインとして使用し、アノテーションが付加された型のチェックが可能
Java SE 8 の主な変更点 1
型アノテーション (Annotations on types)
74
Java SE 再入門
型アノテーション
75
// 型アノテーション@Target(ElementType.TYPE_USE)private @interface MyChecker {}
// 型使用部分に型アノテーションを付与@MyCheckerpublic static class MyClass extends @MyChecker Object {
private @MyChecker String text;
@MyCheckerpublic <@MyChecker T> List<T> execute(@MyChecker T value)
throws @MyChecker IOException {
@MyChecker List<@MyChecker T> list = new @MyChecker ArrayList<>();list.add(value);return list;
}}
クラス宣言やメソッド宣言などの宣言部分以外にも、変数の型やジェネリクスの型パラメータなど、型が使用されているあらゆるところで使用可能。
Java SE 再入門
Checker Framework
76
Java SE 8 には型固有のアノテーションは定義されていませんが、
Checker Framework などの外部ライブラリにより、特定の条件
を検証できるアノテーションが提供されています。また、
Checker Framework 用の Eclipse プラグインや Maven プラグ
インも提供されています。
例えば、@NonNull アノテーションを型に適用した場合は、コン
パイル時にコードパスが null 値を受け取る可能性があるかどうか
を検証できます。
Java SE 再入門
• 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
Java SE 再入門
新しい日付と時間のクラス
78
http://docs.oracle.com/javase/jp/8/api/java/time/package-summary.html
Java SE 再入門
日付/時間 Object の生成と演算
79
public void DateAndTimeSample1() {// 日付オブジェクトの生成、演算、フォーマットSystem.out.println(LocalDate.now());LocalDate localDate = LocalDate.of(2014, 1, 31);System.out.println(localDate.plusDays(10));System.out.println(localDate.format(DateTimeFormatter.ISO_DATE));// 時間オブジェクトの生成、演算、フォーマットSystem.out.println(LocalTime.now());LocalTime localTime = LocalTime.of(13, 58);System.out.println(localTime.minusHours(10));System.out.println(localTime.format(DateTimeFormatter.ISO_TIME));// 日時オブジェクトの生成、演算、フォーマットSystem.out.println(LocalDateTime.now());LocalDateTime localDateTime = 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")));}
Java SE 再入門
タイムゾーンのあり/なし
80
public void DateAndTimeSample2() {// タイムゾーンなしLocalDateTime localDateTime = LocalDateTime.of(2014, 1, 31, 13, 58);System.out.println(localDateTime);// UTCからの時差だけを管理OffsetDateTime offsetDateTime =
OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(9));System.out.println(offsetDateTime);// タイムゾーンありZonedDateTime zonedDateTime =
ZonedDateTime.of(localDateTime, ZoneId.systemDefault());System.out.println(zonedDateTime);
}
2014-01-31T13:582014-01-31T13:58+09:002014-01-31T13:58+09:00[GMT+09:00]
Java SE 再入門
• 単一メソッドのインタフェースのインスタンス生成を簡単に書くための新しいシンタックス (簡易記法)
• ラムダ式を使うと、従来よりも短いコードで、処理の流れが明瞭なコードを記述することが可能
• 関数型インターフェースの導入
• メソッド参照、コンストラクタ参照の導入 (既存のメソッドやコンストラクタをラムダ式のように使用することが可能)
• 仮想拡張メソッド (インタフェースのデフォルト実装) の導入
• Java 8 のラムダ式はクロージャではない (レキシカルスコープを伴わない)
Java SE 8 の主な変更点 3
ラムダ式 (Lambda expressions)
81
Java SE 再入門
関数型インターフェース
82
関数型インターフェースは、実装するべきメソッドが1つしかないインタフェースで、ラムダ式やメソッド参照のターゲットとなる型です。
java.util.function パッケージで汎用的な関数型インタフェースがいくつか提供されていますが、独自に定義することも可能です。
条件に合致すれば関数型インターフェースとして扱われますが、FunctionalInterface アノテーションを付与することで明示化し、不適合の場合にコンパイルエラーとすることもできます。
Java SE 再入門
SAM Type
83
SAM Type は Single-Abstract-Method Type
の略で、抽象メソッドを一つだけ持っているク
ラスやインターフェースの総称です。
デフォルトメソッドを含む具象メソッドの有無
や個数については問われません。
関数型インターフェースは、SAM Type なイン
ターフェースになります。
Java SE 再入門
標準の関数型インターフェース
84
種類 概要 インターフェース名
Function 引数を1つまたは2つ受け取って結果を返却します。
FunctionIntFunctionLongFunction
Consumer 引数を1つまたは2つ受け取って結果は返却しません。
ConsumerIntConsumerLongConsumer
Supplier 引き数を受け取らず結果を返却します。 SupplierIntSupplierLongSupplier
Predicate 引数を1つまたは2つ受け取ってboolean型の結果を返却します。
PredicateIntPredicateLongPredicate
UnaryOperator 引数を1つ受け取って同じ型の結果を返却します。
UnaryOperatorIntUnaryOperatorLongUnaryOperator
Java SE 再入門
メソッド参照/コンストラクタ参照
85
メソッド参照およびコンストラクタ参照を使用するこ
とで、関数型インターフェースのインスタンスを生成
することができます。
既存のメソッドやコンストラクタを特別な表記法で記
述することで、ラムダ式のように使用することが可能
です。
public static void main(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(new char[]{ 'あ', 'い', 'う'}));
}
Java SE 再入門
仮想拡張メソッド
86
仮想拡張メソッドは、インタフェースのメソッ
ドにデフォルトの振る舞いを記述できるように
するものです。
仮想拡張メソッドの導入により、既存のイン
ターフェースにメソッドを追加した場合に、実
装クラスにメソッドのオーバーライドを強要す
ることがなくなり、互換性を維持できます。
また、仮想拡張メソッドの導入により、Java
でも実質的に多重継承が可能になりました。
Java SE 再入門
Default Methods の使用例
87
public class DefaultMethodSample {// デフォルトメソッドを定義したインターフェースpublic interface MyInterface {
default String find() {return "10";
}}// 実装クラスでオーバーライド可能public static class MyClass implements MyInterface{
public String find() {return "20";
}}// オーバーライドしたメソッドの呼び出しpublic static void main(String[] args) {
System.out.println(new MyClass().find());// 20
}}
Java SE 再入門
Static Methods の使用例
88
public class StaticMethodSample {
// 静的メソッドを定義したインターフェースpublic interface MyInterface {
public static String find() {return "10";
}}
// 静的メソッドの呼び出しpublic static void main(String[] args) {
System.out.println(MyInterface.find());// 10
}}
Java SE 再入門
仮想拡張メソッドの特徴
89
• インターフェースのデフォルトメソッドは、実装クラス側でオーバーライド可能
• C++ とは異なり、状態の多重継承はできない
(インターフェースではインスタンス変数を保有できないため)
• 菱形継承によるメソッド名の重複問題は、呼び出し順による優先順位付けで解決
• 優先順位が判断できない場合は、コンパイルエラー
interfaceA
interfaceB interfaceC
classD
interfaceB と interfaceC に同名のデフォルトメソッドが存在する場合はコンパイルエラー。
Java SE 再入門
ラムダ式 (Lambda Expressions)
90
ラムダ式は、関数型インタフェースの実装匿名クラス
の簡易記法です。ラムダ式は以下の構文で記述します。
(引数) -> { 処理 }
ラムダ式の引数は、実装する関数型インタフェースの
メソッドの引数と同じになります。
ラムダ式導入のメリットは、後述する Stream API で
ラムダ式を使用することにより、内部イテレータを使
用した並列処理が簡潔に記述可能になることです。
Java SE 再入門
ラムダ式の構文
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;
Java SE 再入門
実質的に final
92
ラムダ式では匿名クラスと同様に、エンクロージング
環境のローカル変数を参照可能ですが、final 修飾子が
付与されている変数しか参照することができません。
但し、Java SE 8 では、値の変更が行われていない変
数は実質的に final として扱われます。
public static void main(String[] args) {// 実質的 final なローカル変数int value1 = 10;List<Integer> values = Arrays.asList(10, 20, 30);// ラムダ式values.stream().
forEach(value2 -> System.out.println(value1 + value2));// 20, 30, 40
}
Java SE 再入門
クロージャ (Closure)
93
Closure (関数閉包) は、プログラミング言語における
関数オブジェクトの一種。いくつかの言語ではラムダ
式や無名関数で実現している。引数以外の変数を実行
時の環境ではなく、自身が定義された環境(静的ス
コープ)において解決することを特徴とする。関数と
それを評価する環境のペアであるともいえる。
(Wikipedia より引用)
Java のラムダ式は、静的スコープ (レキシカルスコー
プ) の扱いが制限されている (実質的に final な変数に
しかアクセスできない) ため、他言語で一般的に「ク
ロージャ」と呼ばれている機能とは多少異なります。
Java SE 再入門
JavaScript での Closure 実装例
94
123
function outer() {var i = 0;i++;return function () {
return i++;};
}var func = outer();print(func());print(func());print(func());
Java SE 再入門
ラムダ式と invokedynamic
95
ラムダ式の実行は、Java SE 7 で導入されたバイト
コード命令の invokedynamic を使用しています。
invokedynamic を使用することにより、ラムダ式の
クラスはコンパイル時ではなく実行時に生成されます。
クラスの生成を実行時に行うことで、アプリケーショ
ン起動時のクラスロード処理を抑制できるメリットが
あります。
Java SE 8 のアプリケーションで頻繁に使用されるで
あろう Stream API は、ラムダ式により大量のクラス
を生成するため恩恵が大きい。
Java SE 再入門
• 要素のストリームに対する関数型スタイルの操作をサポートする Stream API が追加 (コレクションのバルク処理が可能に)
• @Repeatable アノテーションにより、1要素に同じ型の複数の注釈を付加することが可能に
• リフレクションによるメソッドやコンストラクタの引数情報(引数名等) の取得が可能に
• Optional 型の導入
• 符号付き整数を符号なし整数として取り扱うメソッドをラッパークラス (Integer, Long クラス等)に追加
• GUI フレームワークとして JavaFX 8 が統合
(java コマンドにより JavaFX アプリケーションが起動可能)
Java SE 8 の主な変更点 4
96
Java SE 再入門
• クラスの依存関係を解析するための jdeps コマンドライン・ツールを提供
• Java Mission Control 5.4 を提供 (細密なデータ分析を可能にする先進的な監視および管理機能を提供)
• Compact プロファイルの導入
(Java SE プラットフォームをサブセット形式で提供可能)
• Base64 のエンコーディング/デコーディングを標準でサポート
• JDBC-ODBC ブリッジが廃止
• Unicode 6.2.0 のサポート
• java.util.concurrent パッケージの更新
(キャッシュ指向の機能拡張やパフォーマンス改善など)
Java SE 8 の主な変更点 5
97
Java SE 再入門
• 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
Java SE 再入門
Stream API
99
Stream API は、要素の集まり (配列やコレクションな
ど) に対するさまざまな操作を抽象化した API です。
ストリームの操作は中間操作と終端操作に分かれ、こ
れらを組み合わせてストリーム・パイプラインを形成
します。
中間操作は新しいストリームを返しますが、これらの
操作は常に遅延されます。
ラムダ式を利用したストリームの遅延評価アプローチ
によって、マルチコア・プロセッサを効率的に使用す
る並列処理の記述が容易になりました。
Java SE 再入門
遅延評価 (lazy evaluation)
100
遅延評価とは、実際にその値が必要になるまで、その
値に対する計算処理を遅らせるという評価手法の一つ
で、関数型言語界隈でよく使用される言葉です。
Java の Stream API やラムダ式における遅延評価は、
正確には遅延評価ではなく遅延処理と呼ぶべきもので
あるため、安易に遅延評価という言葉は使わないほう
が良さそうです。
遅延処理には、遅延リストを使用した無限リストの取
り扱いが可能になる、本来必要のない無駄な計算を省
けるなどのメリットがあります。
Java SE 再入門
Stream の生成
101
ストリームのインスタンスは、配列 や Collection などから生成
することが可能です。
public void createStream() {// 配列から生成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);
}
Java SE 再入門
Stream の中間操作
102
ストリームに対して、以下のような中間操作が可能です。
戻り値は全てストリームです。
中間操作 概要
filter 指定された条件に一致するものを抽出します。
map ストリームの各要素に指定された関数を適用した結果を返します。
flatMap ストリームの各要素に指定された関数を適用した結果得られたストリームを纏めたストリームを返します。
distinct Object.equals(Object) による重複を除いた要素を抽出します。
sorted ストリームの各要素をソートした結果を返します。
peek ストリームをそのまま返します。デバッグ用途などで、各要素に対して副作用を伴う処理を実行する場合に使用します。
limit 要素を指定された最大サイズ以内の長さに切り詰めた結果を返します。
skip 指定された最初の n 個の要素を破棄した結果を返します。
Java SE 再入門
順次ストリーム/並列ストリーム
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
Java SE 再入門
Stateless/Statefull な操作
104
ストリームの中間操作には、ステートレス操作とステー
トフル操作の 2 種類の操作が存在します。
ステートレス操作 (Stateless Operation)ステートレス操作 (filter, map, flatMap) は、各要素を処理する際に、
他の要素の影響を受けない操作です。ステートレスな中間操作のみを含
むパイプラインは、順次処理、並列処理のいずれであっても、最小限の
データ・バッファリングで単一パスで処理できます。
ステートフル操作 (Statefull Operation)ステートフル操作 (distinct, sorted, limit, skip) は、各要素を処理する際に、他の要素の影響を受ける操作です。その為、ステートフルな中間操作を並列処理で行った場合は、処理効率が悪化する可能性があるので注意が必要です。
Java SE 再入門
Stream の終端操作
105
ストリームに対して、以下のような終端操作が可能です。
複数回の終端操作を行うと例外が発生します。
終端操作 概要
forEach ストリームの各要素に対してアクションを実行します。
toArray ストリームの要素を含む配列を返します。
reduce ストリームの要素に対してリダクション操作を実行します。
collect ストリームの要素に対して可変リダクション操作を実行します。
min 指定されたComparatorに従ってストリームの最小要素を返します。
max 指定されたComparatorに従ってストリームの最大要素を返します。
count ストリームの要素数を返します。
anyMatch 条件に一致する要素が存在する場合に true を返します。
allMatch 全ての要素が条件に一致する場合に true を返します。
noneMatch 全ての要素が条件に一致しない場合に true を返します。
Java SE 再入門
リダクション操作 (折りたたみ)
106
リダクション操作は、一連の入力要素に対して結合操作を繰り返し、
単一のサマリー結果を返却します。リダクション操作は、順次に実
行することも並列に実行することもできます。Java では可変リダク
ション操作のための Collector インターフェースが提供されており、
Collector の仕様を決定する4つの関数を返却する以下のメソッドが
定義されています。
メソッド名 戻り値の型 戻り値
supplier Supplier<A> 新しい可変結果コンテナを返す関数
accumulator BiConsumer<A,T> 可変結果コンテナに値を折りたたむ関数
combiner BinaryOperator<A> 2つの部分的な結果を結合して1つの合成結果を作成する関数
finisher Function<A,R> 中間結果を最終結果に変換する関数
また、Stream インタフェースには、Collector を使ってストリーム
の要素に対する可変リダクション操作を実行するための collect メ
ソッドが定義されています。
Java SE 再入門
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 を返します。
Java SE 再入門
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]
Java SE 再入門
Repeating Annotations
109
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Repeatable(MyAnnotations.class)public @interface MyAnnotation {
String value();}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotations {
MyAnnotation[] value();}@MyAnnotation("hoge")@MyAnnotation("fuga")public static class MyClass {
public void print() {MyAnnotations annotations =
MyClass.class.getDeclaredAnnotation(MyAnnotations.class);Arrays.stream(annotations.value()).forEach(System.out::println);
}}
1要素に同じ型の複数の注釈を付加
Java SE 再入門
Optional
110
Optional は、 T 型の値を一つだけ保持できる
イミュータブルなコンテナクラスです。
null の可能性のある値をラップすることにより
null チェックの冗長な記述を排除可能で、基本
データ型用の OptionalInt、OptionalDouble、
OptionalLong クラスも提供されています。
Stream API には、Optional 型を返す終端メ
ソッドが多数存在するため、流れるように処理
を記述できます。
Java SE 再入門
Optional の使用例
111
import java.util.Optional;
public class OptionalSample {public static class MyClass {
// Optional 型を返却するメソッドpublic static Optional<String> getHoge(String value) {
// null の場合は空の Optional を返却return Optional.ofNullable(value);
}}public static void main(String[] args) {
System.out.println(MyClass.getHoge("あ").orElse("い"));System.out.println(MyClass.getHoge(null).orElseGet(() -> "う"));MyClass.getHoge("え").ifPresent(hoge -> System.out.println(hoge));
}}
あうえ
Java SE 再入門
JavaFX
112
JavaFX は、JVM 上で動作する GUI アプリケー
ションのプラットフォームです。
ハードウェアアクセラレーション対応の軽量 Java
UI プラットフォームを提供する目的で設計されて
おり、Swing アプリケーション内で JavaFX を使
用して、既存のプリケーションを拡張することも可
能です。
標準技術である XML (FXML) や CSS を使用した
スタイリングが可能で、JavaFX Scene Builder と
言う GUI ツールが無償で提供されています。
Java SE 再入門
JavaFX Sample
113
Oracle 社の Java SE Downloads サイトから、サ
ンプルアプリケーションのダウンロードが可能です。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Java SE 再入門
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, …
Java SE 再入門
JavaScript の実行
115
public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("js");System.out.println("engine = " + engine);try {
// 指定されたスクリプトの実行engine.eval("print('Hello, World');");engine.eval("function sum(a, b) { return a + b; }");// 関数の呼び出しInvocable inv = (Invocable) engine;System.out.println(inv.invokeFunction("sum", 10, 20));
} catch (ScriptException | NoSuchMethodException e) {e.printStackTrace();
}}
engine = jdk.nashorn.api.scripting.NashornScriptEngine@4524411fHello, World30
コマンドラインから jjs コマンドで js ファイルを実行することも可能です。
Java SE 再入門
Hotspot VM と JRockit VM の統合
116
Oracle 社が BEA Systems 社と Sun Microsystems 社を買収し
たことにより、 Oracle 社は2つの JVM 実装を保有することにな
りました。
Oracle 社では、多数のプラットフォームに対応し、利用者数の多
い Hotspot VM と、 Intel CPU とサーバーサイド用途に最適化さ
れた JRockit VM を統合し、より優れた JVM を提供することを目
標としているそうです。
Java SE 8 では、その一環として、JRockit VM 側に存在しなかっ
た Permanent 領域が HotSpot VM から削除されています。
ヒープ領域の一種である Permanent 領域が Metaspace と呼ばれ
る Native メモリ領域に変更されることにより、DI による大量の
メタデータ格納時などに発生する Permanent 領域不足が原因の
OutOfMemoryError から解放されます。
Java SE 再入門
おまけ
117
Java SE 再入門
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日時点)
Java SE 再入門
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 サーバによる
定期監視により、適切なリソース管理を行うことが可
能になります。
Java SE 再入門
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
Java SE 再入門
Java 関連のお勧め書籍
121
タイトル : Java逆引きレシピ
出版社 : 翔泳社
著者 : 竹添 直樹, 高橋 和也
織田 翔, 島本 多可子
発売日 : 2014/4/22
ページ数 : 576ページ
価格 : 3,024円 (税込)
タイトル : Effective Java 第2版
出版社 : 丸善出版
著者 : Joshua Bloch (著)
柴田 芳樹 (翻訳)
発売日 : 2014/3/11
ページ数 : 327ページ
価格 : 3,888円 (税込)
Java SE 再入門
Java SE 9
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 APIJSON データの生成と読み込みを行うライトウェイト API を提供
JEP 199 Smart Java Compilation, Phase TwoSmart Java コンパイラの改善
JEP 200 The Modular JDKJDK のモジュール構造を定義
JEP 201 Modular Source CodeJDK ソースコードをモジュールへ再編成し、ビルドシステムを改良します
Project Jigsaw
Java SE 再入門
まとめ
123
Java SE 再入門
• 強い静的型付けによる安心感とIDEによる支援
• 多数のプラットフォームで開発・動作が可能
• 高い互換性 (ソース・バイナリ・プラットフォーム) を維持しながらも着実に進化
• コンパイル速度、実行速度が速い
• JVM 上で動作する言語が増加しているが、既存の資産や知識をある程度は流用可能
• 情報や書籍、ライブラリが豊富
• プログラマの確保が比較的容易
Java の良いところ
124
Java SE 再入門
• コードが冗長になりがち
• NPE、ヌルポ
• 互換性を重要視するがゆえに言語の進化のスピードが遅い
• 膨大な数のライブラリやフレームワークが存在するがゆえに取捨選択が必要
• メジャー言語であるがゆえにプログラマのスキルの差が激しい
• 若者の Java 離れが顕著
Java の良くないところ
125
Java SE 再入門
世の中には多数の開発言語やライブラリ
が存在しますが、システム特性や開発規
模、メンバー構成などにより最適なアー
キテクチャは異なります。
Java は、規模が大きく、ライフサイクル
の長いアプリケーションの開発に適して
いると言われており、現時点でも主要な
選択肢の一つです。
126
最後に
Java SE 再入門
Modern Java
is the best Java.
127
Java SE 再入門
おわり
128