java se 再入門

128
Java SE 再入門 To Java SE 8 from J2SE 1.4 September 2014 @minazou67

Upload: minazou67

Post on 24-May-2015

10.077 views

Category:

Technology


10 download

DESCRIPTION

Java SE Re-Introduction

TRANSCRIPT

Page 1: Java SE 再入門

Java SE 再入門

To Java SE 8 from J2SE 1.4

September 2014

@minazou67

Page 2: Java SE 再入門

Java SE 再入門

はじめに

本スライドは、J2SE 1.4 から Java

SE 8 の新機能について広く浅く解説し、

短時間で Java SE に関する知識を網羅

的に学習することを目的としています。

Java を学ぶきっかけになれば幸いです。

2

• 本スライドでは、Java の基本的な事項 (変数、演算子、制御構文、クラスなど) については取り扱いません。

• 本スライドで紹介している機能が、Java SE の新機能の全てではありません。

• 本スライドに掲載されている会社名、製品名、サービス名、ロゴは、各社・各団体の商標または登録商標です。

Page 3: Java SE 再入門

Java SE 再入門

Target

• Java の知識が Java SE 6

付近で止まっている人

• Java 使ってるけど、実は

よく知らないという人

• Java 初心者な人

3

Page 4: Java SE 再入門

Java SE 再入門

Goal

Java SE の各バージョンの更新内容

を再確認することにより、既存の知

識を整理すると共に、最新バージョ

ンの Java SE について学び、より

モダンなプログラミングスタイルを

身に付けましょう。

4

Page 5: Java SE 再入門

Java SE 再入門

Java に関する

あれやこれや

5

Page 6: Java SE 再入門

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

Page 7: Java SE 再入門

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

Page 8: Java SE 再入門

Java SE 再入門

JRE (Java Runtime Environment)

Java 実行環境

Java 仮想マシン (JVM) と実行時ライブラリのセット

JDK (Java Development Kit)

Java 開発キット

開発ツール群と開発ツールが使用する非公開 JRE のセット(非公開 JRE は、開発ツールの実行のためだけに存在します。)

Java 関連用語 2

8

Page 9: Java SE 再入門

Java SE 再入門

JVM (Java Virtual Machine)

Java 仮想マシン

コンパイラが生成する Java バイトコードをプラットフォーム固有のネイティブコードに変換して実行するソフトウェア

Java 関連用語 3

9

Java バイトコード (Java byte code)

Java 仮想マシン用の命令セット

ターゲットマシンのアーキテクチャに依存することなく実行速度を向上させるための中間コード

Page 10: Java SE 再入門

Java SE 再入門

JNI (Java Native Interface)

他言語との相互運用のためのインタフェース仕様

Java から他言語で作成したライブラリのネイティブメソッドを呼び出すことが可能、またその逆も可能

Java 関連用語 4

10

JNDI (Java Naming and Directory Interface)

ネーミグサービスやディレクトリサービスを参照するためのインタフェース仕様

LDAP や DNS, RMI, DataSource のようなサービスに対応

Page 11: Java SE 再入門

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

Page 12: Java SE 再入門

Java SE 再入門

• オブジェクト指向プログラミング言語

• 強い静的型付け言語

• Write Once, Run Anywhere (Platform 非依存)

• コンパイラにより Java バイトコードを生成

• Java 仮想マシン (JVM) の上で動作

• ガベージコレクションによるメモリ管理

• C 言語ライクな構文

• マルチスレッドをサポート

• 高い互換性 (ソース・バイナリ・プラットフォーム)

Java の特徴

12

Page 13: Java SE 再入門

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

Page 14: Java SE 再入門

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 など多数の実装が存在しています。

Page 15: Java SE 再入門

Java SE 再入門

JVM の起動モード

15

Client Modeクライアントアプリケーション用に最適化され、起動時間が短くなり、メモリーフットプリントが減少

64bit 版の JDK では、このオプションを無視し、代わりに server モードが選択されます。

Server Modeサーバーアプリケーション用に最適化され、起動時間は長くなるが、スループットが向上

マルチプロセッサで且つ、物理メモリが 2GB 以上あるとサーバークラスマシンとして検出され、 server モードで起動されます。

Page 16: Java SE 再入門

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

Page 17: Java SE 再入門

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

Page 18: Java SE 再入門

Java SE 再入門

J2SE 1.4(JSR 59)

18

Page 19: Java SE 再入門

Java SE 再入門

• 2002年2月6日にリリース

• コードネームは Merlin

• 2008年10月に EOL

• 「Java Community Process (JCP)」のもとで開発された初めての Java プラットフォーム

• 言語仕様が大幅に拡張され、多数の新機能が追加された

• テーマは、信頼性、保守性、スケーラビリティ、パフォーマンス、配備

J2SE 1.4 概要

19

Page 20: Java SE 再入門

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

Page 21: Java SE 再入門

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

Page 22: Java SE 再入門

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

Page 23: Java SE 再入門

Java SE 再入門

アサーション (表明) は、プログラムが仕様通りに正しく動作し

ているかを検証するための機能です。

以下のように、assert ステートメントで表明します。

Assertion

23

assert Expression1 ;assert Expression1 : Expression2 ;

式1 は boolean 型の式で、false の場合に AssertionError が発

生します。式2 はエラーの詳細メッセージを返す任意の式です。

java コマンドに「-ea」オプションを指定して実行するとアサー

ションが有効になります。

Page 24: Java SE 再入門

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)

Page 25: Java SE 再入門

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 ファイルを指定可能

Page 26: Java SE 再入門

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

Page 27: Java SE 再入門

Java SE 再入門

J2SE 5.0(JSR 176)

27

Page 28: Java SE 再入門

Java SE 再入門

• 2004年9月30日にリリース

• コードネームは Tiger

• 2009年10月に EOL

• 言語仕様が大幅に拡張され、多数の新機能が追加された

• テーマは、信頼性・可用性・保守性、パフォーマンスとスケーラビリティ、開発容易性、デスクトップクライアント

J2SE 5.0 概要

28

Page 29: Java SE 再入門

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

Page 30: Java SE 再入門

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

Page 31: Java SE 再入門

Java SE 再入門

• BigDecimal クラスの強化による小数点演算の強化

(固定精度の浮動小数点計算をサポート)

• 総称型 (Generics) の追加による、コンパイラのタイプセーフ検証の強化 (キャスト作業の省略と型安全)

• アノテーション (注釈) によるメタデータ機能の追加

(ボイラープレートコードの自動生成が可能)

• 列挙型 (enum)、オートボクシング・アンボクシング 、拡張for 文、静的インポート、可変長引数による拡張

• Unicode 4.0 および補助文字のサポート

• JAR ファイルを高圧縮する新しい Pack200 形式をサポート

(JAR ファイルのダウンロードサイズを大幅に削減)

J2SE 5.0 の主な変更点 1

31

Page 32: Java SE 再入門

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

Page 33: Java SE 再入門

Java SE 再入門

ジェネリクスは、汎用的な型を取り扱うクラスやインター

フェースに型パラメータリスト (型変数) を記述し、インス

タンス化する際に型変数に型を与えることにより、コンパ

イル時に型を保障しながら汎用的な型を取り扱うための仕

組みです。型変数はメソッドの宣言に対しても指定するこ

とができます。

メジャーな実装例としては、コレクション API

(java.util.List や java.util.Map) が挙げられ、コードが型

安全になることにより、実行時の ClassCastException が

抑制できます。

総称型 (Generic type)

33

Page 34: Java SE 再入門

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

型パラメータリスト

インスタンス生成時に型を指定

Page 35: Java SE 再入門

Java SE 再入門

アノテーションはコードに付加するメタデータで、パッ

ケージやクラス、メソッド、フィールドなどに適用するこ

とができます。アノテーションは、プログラムの動作に影

響を与えません。

コードにメタデータを付加することの最大のメリットは、

コンパイラがメタデータを解釈することにより、コンパイ

ル時に様々なチェックが可能になると言う点です。また、

外部の解析ツールやライブラリなどがメタデータを解釈す

ることにより、コードやドキュメントの自動生成、DI など

が実現可能となります。

注釈 (Annotation)

35

Page 36: Java SE 再入門

Java SE 再入門

以下のような標準アノテーション型が提供されています。

標準 Annotation

36

Override

メソッドをオーバーライドしていることを明示する注釈

メソッドに対してのみ使用可能

Deprecated

非推奨であることを明示する注釈

非推奨のプログラム要素が使用されている場合に、コンパイラ警告とすることが可能

SuppressWarnings

コンパイラ警告を抑制する注釈

以前のバージョンで書かれたコードに対して有効

Page 37: Java SE 再入門

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);}

}}

Page 38: Java SE 再入門

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);

}

Page 39: Java SE 再入門

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);}

}

Page 40: Java SE 再入門

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));

}}

Page 41: Java SE 再入門

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");

}}

Page 42: Java SE 再入門

Java SE 再入門

Java SE 6(JSR 270)

42

Page 43: Java SE 再入門

Java SE 再入門

• 2006年12月11日にリリース

• コードネームは Mustang

• 2013年2月に EOL

• 名称が J2SE から Java SE に変更され、バージョン番号から小数点以下が削除された

• 大幅な言語仕様の変更はないが、多数の新機能の追加や管理機能の強化、安定性の向上などが行われた

• テーマは、互換性、開発容易性、診断機能・監視と管理、エンタープライズデスクトップ、XML & Web サービス、透明性

Java SE 6 概要

43

Page 44: Java SE 再入門

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

Page 45: Java SE 再入門

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

Page 46: Java SE 再入門

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

Page 47: Java SE 再入門

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

Page 48: Java SE 再入門

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発行用のコマンドラインツール) を使用して、バックアップなどの管理作業が可能

Page 49: Java SE 再入門

Java SE 再入門

Java VisualVMは、JVM 上で実行されている Java アプリケー

ションのモニタリングやプロファイリング、トラブルシューティ

ングを行うための GUI ツールです。

JConsole、jstat、jinfo、jstack などの既存のスタンドアロンツー

ルを連携させて JVM からデータを取得し、それらの情報を編集し

て画面に表示します。プラグインによる機能追加も可能です。

Java VisualVM

49

Page 50: Java SE 再入門

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();

}}

Page 51: Java SE 再入門

Java SE 再入門

Java SE 7(JSR 336)

51

Page 52: Java SE 再入門

Java SE 再入門

• 2011年7月28日にリリース

• コードネームは Dolphin

• 2015年4月に EOL

• Project Coin による多数の言語仕様の改善や新規ファイルシステム API の提供、動的言語のサポート強化などが行われた

• リファレンス実装が Sun JDK から OpenJDK へ変更された

• テーマは、互換性、生産性、パフォーマンス、普遍性、統合

Java SE 7 概要

52

Page 53: Java SE 再入門

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

Page 54: Java SE 再入門

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

Page 55: Java SE 再入門

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 ユーティリティクラスが提供されています。

Page 56: Java SE 再入門

Java SE 再入門

• Java 仮想マシンにおける動的型付け言語のサポート強化

• 動的型付け言語が高速に動作するバイトコード命令を追加

• 動的言語サポート API (java.lang.invoke パッケージ) を追加

• 新しい動的リンクメカニズムを提供

• 静的な型情報がなくてもメソッド呼び出しの実行が可能

• JIT コンパイラの最適化の恩恵を享受

• Java SE 8 でサポート予定のラムダ式での使用も想定

Java SE 7 の主な変更点 2

InvokeDynamic(Support for dynamically-typed languages)

56

Page 57: Java SE 再入門

Java SE 再入門

• invokestatic (静的メソッドの呼出し)

• invokevirtual (クラスのメソッドの呼び出し)

• invokeinterface (インターフェイスのメソッドの呼び出し)

• invokespecial (コンストラクタ、プライベートメソッドの呼び出し)

JVM のメソッド呼出し

57

既存のバイトコード命令 (Java 用に最適化)

追加されたバイトコード命令(動的言語用に最適化)

• invokedynamic (動的型付け言語向けのメソッドの呼び出し)

• 命令に紐付く処理を言語処理系が独自に選択可能

• 命令に紐付く処理を実行時に変更可能

Page 58: Java SE 再入門

Java SE 再入門

• バイナリリテラルを利用可能

(「0b」または「0B」を接頭辞にすることで 2 進数を表現)

• 数値リテラルにアンダースコアを利用可能 (可読性を向上)

• switch 文の case ラベルに文字列を使用可能

• コンストラクタ呼び出し時の型推論をサポート

(ダイヤモンド演算子)

• リソース管理用構文の追加 (try-with-resources)

• 例外のマルチキャッチと再スローについての改善

• 可変長引数メソッド呼び出しの警告の抑制

(メソッド呼び出し側ではなく宣言側に警告を出力するように変更)

Java SE 7 の主な変更点 3

Project Coin (Small language enhancements)

58

Page 59: Java SE 再入門

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;

Page 60: Java SE 再入門

Java SE 再入門

Project Coin

switch 文の case ラベルに文字列を使用可能

public void stringInSwitch() {String text = "hoge";switch (text) {case "fuga":

break;case "piyo":

break;default:

break;}

}

Page 61: Java SE 再入門

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<>();

}

Page 62: Java SE 再入門

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();

}}

Page 63: Java SE 再入門

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で自動補正可能

Page 64: Java SE 再入門

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;

}}

再スローする例外の型が条件を満たしているかコンパイラが確認

Page 65: Java SE 再入門

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

Page 66: Java SE 再入門

Java SE 再入門

Java Flight Recorder

66

Java Flight Recorder は、JRockit VM に付属する JVM と実行

中のアプリケーションに関する詳細情報を記録ためのツールです。

Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン

ドルされています。

JVM 内にメモリなどの稼働状況を監視する機能を内蔵し、それ

らが低負荷で動作することより、本番環境での常時記録が可能と

なっており、問題発生時に迅速な対応を行うことが可能です。

Page 67: Java SE 再入門

Java SE 再入門

Java Mission Control

67

Java Mission Control は、Java アプリケーションの管理、モニ

タリング、プロファイルおよびトラブルシューティングを行うた

めのツールスイートです。

Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン

ドルされています。

JMX コンソールと Java Flight Recorder から構成されており、

プラグインを簡単にインストールできます。

Page 68: Java SE 再入門

Java SE 再入門

VisualVM と JMC の違い

68

Java VisualVM と Java Mission Control は、非常に

よく似たツールですが、いくつかの違いがあります。

Java VisualVM

• プラグインが豊富

• 無償で利用可能

Java Mission Control

• 基本機能が豊富

• 強力な監視機能

• JVMの有償サポートが必要 (開発用途での利用は無料)

Page 69: Java SE 再入門

Java SE 再入門

java.util.Objects

69

静的メソッドのみで構成されている便利なユーティリ

ティークラスが提供されました。

http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html

Page 70: Java SE 再入門

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 領域に割り当てる方式

アプリケーション停止時間は短縮するがスループットは低下

Page 71: Java SE 再入門

Java SE 再入門

Java SE 8(JSR 337)

71

Page 72: Java SE 再入門

Java SE 再入門

• 2014年3月18日にリリース

• コードネームは存在しない

• 2017年3月に EOL 予定

• ラムダ式の導入や新しい JavaScript エンジンの導入、JavaFX の統合などが行われた

• Compact プロファイルの導入により、Java SE プラットフォームをサブセット形式で提供可能になった

• テーマは存在しない

Java SE 8 概要

72

Page 73: Java SE 再入門

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

Page 74: Java SE 再入門

Java SE 再入門

• 型アノテーションにより、宣言部に限らず、型が使用される任意の場所にアノテーションを適用可能

• java.lang.annotation.ElementType にTYPE_PARAMETER (型パラメータ宣言) とTYPE_USE (型使用箇所) が追加

• 型チェック・フレームワークをコンパイラのプラグインとして使用し、アノテーションが付加された型のチェックが可能

Java SE 8 の主な変更点 1

型アノテーション (Annotations on types)

74

Page 75: Java SE 再入門

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;

}}

クラス宣言やメソッド宣言などの宣言部分以外にも、変数の型やジェネリクスの型パラメータなど、型が使用されているあらゆるところで使用可能。

Page 76: Java SE 再入門

Java SE 再入門

Checker Framework

76

Java SE 8 には型固有のアノテーションは定義されていませんが、

Checker Framework などの外部ライブラリにより、特定の条件

を検証できるアノテーションが提供されています。また、

Checker Framework 用の Eclipse プラグインや Maven プラグ

インも提供されています。

例えば、@NonNull アノテーションを型に適用した場合は、コン

パイル時にコードパスが null 値を受け取る可能性があるかどうか

を検証できます。

Page 77: Java SE 再入門

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

Page 78: Java SE 再入門

Java SE 再入門

新しい日付と時間のクラス

78

http://docs.oracle.com/javase/jp/8/api/java/time/package-summary.html

Page 79: Java SE 再入門

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")));}

Page 80: Java SE 再入門

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]

Page 81: Java SE 再入門

Java SE 再入門

• 単一メソッドのインタフェースのインスタンス生成を簡単に書くための新しいシンタックス (簡易記法)

• ラムダ式を使うと、従来よりも短いコードで、処理の流れが明瞭なコードを記述することが可能

• 関数型インターフェースの導入

• メソッド参照、コンストラクタ参照の導入 (既存のメソッドやコンストラクタをラムダ式のように使用することが可能)

• 仮想拡張メソッド (インタフェースのデフォルト実装) の導入

• Java 8 のラムダ式はクロージャではない (レキシカルスコープを伴わない)

Java SE 8 の主な変更点 3

ラムダ式 (Lambda expressions)

81

Page 82: Java SE 再入門

Java SE 再入門

関数型インターフェース

82

関数型インターフェースは、実装するべきメソッドが1つしかないインタフェースで、ラムダ式やメソッド参照のターゲットとなる型です。

java.util.function パッケージで汎用的な関数型インタフェースがいくつか提供されていますが、独自に定義することも可能です。

条件に合致すれば関数型インターフェースとして扱われますが、FunctionalInterface アノテーションを付与することで明示化し、不適合の場合にコンパイルエラーとすることもできます。

Page 83: Java SE 再入門

Java SE 再入門

SAM Type

83

SAM Type は Single-Abstract-Method Type

の略で、抽象メソッドを一つだけ持っているク

ラスやインターフェースの総称です。

デフォルトメソッドを含む具象メソッドの有無

や個数については問われません。

関数型インターフェースは、SAM Type なイン

ターフェースになります。

Page 84: Java SE 再入門

Java SE 再入門

標準の関数型インターフェース

84

種類 概要 インターフェース名

Function 引数を1つまたは2つ受け取って結果を返却します。

FunctionIntFunctionLongFunction

Consumer 引数を1つまたは2つ受け取って結果は返却しません。

ConsumerIntConsumerLongConsumer

Supplier 引き数を受け取らず結果を返却します。 SupplierIntSupplierLongSupplier

Predicate 引数を1つまたは2つ受け取ってboolean型の結果を返却します。

PredicateIntPredicateLongPredicate

UnaryOperator 引数を1つ受け取って同じ型の結果を返却します。

UnaryOperatorIntUnaryOperatorLongUnaryOperator

Page 85: Java SE 再入門

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[]{ 'あ', 'い', 'う'}));

}

Page 86: Java SE 再入門

Java SE 再入門

仮想拡張メソッド

86

仮想拡張メソッドは、インタフェースのメソッ

ドにデフォルトの振る舞いを記述できるように

するものです。

仮想拡張メソッドの導入により、既存のイン

ターフェースにメソッドを追加した場合に、実

装クラスにメソッドのオーバーライドを強要す

ることがなくなり、互換性を維持できます。

また、仮想拡張メソッドの導入により、Java

でも実質的に多重継承が可能になりました。

Page 87: Java SE 再入門

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

}}

Page 88: Java SE 再入門

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

}}

Page 89: Java SE 再入門

Java SE 再入門

仮想拡張メソッドの特徴

89

• インターフェースのデフォルトメソッドは、実装クラス側でオーバーライド可能

• C++ とは異なり、状態の多重継承はできない

(インターフェースではインスタンス変数を保有できないため)

• 菱形継承によるメソッド名の重複問題は、呼び出し順による優先順位付けで解決

• 優先順位が判断できない場合は、コンパイルエラー

interfaceA

interfaceB interfaceC

classD

interfaceB と interfaceC に同名のデフォルトメソッドが存在する場合はコンパイルエラー。

Page 90: Java SE 再入門

Java SE 再入門

ラムダ式 (Lambda Expressions)

90

ラムダ式は、関数型インタフェースの実装匿名クラス

の簡易記法です。ラムダ式は以下の構文で記述します。

(引数) -> { 処理 }

ラムダ式の引数は、実装する関数型インタフェースの

メソッドの引数と同じになります。

ラムダ式導入のメリットは、後述する Stream API で

ラムダ式を使用することにより、内部イテレータを使

用した並列処理が簡潔に記述可能になることです。

Page 91: Java SE 再入門

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;

Page 92: Java SE 再入門

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

}

Page 93: Java SE 再入門

Java SE 再入門

クロージャ (Closure)

93

Closure (関数閉包) は、プログラミング言語における

関数オブジェクトの一種。いくつかの言語ではラムダ

式や無名関数で実現している。引数以外の変数を実行

時の環境ではなく、自身が定義された環境(静的ス

コープ)において解決することを特徴とする。関数と

それを評価する環境のペアであるともいえる。

(Wikipedia より引用)

Java のラムダ式は、静的スコープ (レキシカルスコー

プ) の扱いが制限されている (実質的に final な変数に

しかアクセスできない) ため、他言語で一般的に「ク

ロージャ」と呼ばれている機能とは多少異なります。

Page 94: Java SE 再入門

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());

Page 95: Java SE 再入門

Java SE 再入門

ラムダ式と invokedynamic

95

ラムダ式の実行は、Java SE 7 で導入されたバイト

コード命令の invokedynamic を使用しています。

invokedynamic を使用することにより、ラムダ式の

クラスはコンパイル時ではなく実行時に生成されます。

クラスの生成を実行時に行うことで、アプリケーショ

ン起動時のクラスロード処理を抑制できるメリットが

あります。

Java SE 8 のアプリケーションで頻繁に使用されるで

あろう Stream API は、ラムダ式により大量のクラス

を生成するため恩恵が大きい。

Page 96: Java SE 再入門

Java SE 再入門

• 要素のストリームに対する関数型スタイルの操作をサポートする Stream API が追加 (コレクションのバルク処理が可能に)

• @Repeatable アノテーションにより、1要素に同じ型の複数の注釈を付加することが可能に

• リフレクションによるメソッドやコンストラクタの引数情報(引数名等) の取得が可能に

• Optional 型の導入

• 符号付き整数を符号なし整数として取り扱うメソッドをラッパークラス (Integer, Long クラス等)に追加

• GUI フレームワークとして JavaFX 8 が統合

(java コマンドにより JavaFX アプリケーションが起動可能)

Java SE 8 の主な変更点 4

96

Page 97: Java SE 再入門

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

Page 98: Java SE 再入門

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

Page 99: Java SE 再入門

Java SE 再入門

Stream API

99

Stream API は、要素の集まり (配列やコレクションな

ど) に対するさまざまな操作を抽象化した API です。

ストリームの操作は中間操作と終端操作に分かれ、こ

れらを組み合わせてストリーム・パイプラインを形成

します。

中間操作は新しいストリームを返しますが、これらの

操作は常に遅延されます。

ラムダ式を利用したストリームの遅延評価アプローチ

によって、マルチコア・プロセッサを効率的に使用す

る並列処理の記述が容易になりました。

Page 100: Java SE 再入門

Java SE 再入門

遅延評価 (lazy evaluation)

100

遅延評価とは、実際にその値が必要になるまで、その

値に対する計算処理を遅らせるという評価手法の一つ

で、関数型言語界隈でよく使用される言葉です。

Java の Stream API やラムダ式における遅延評価は、

正確には遅延評価ではなく遅延処理と呼ぶべきもので

あるため、安易に遅延評価という言葉は使わないほう

が良さそうです。

遅延処理には、遅延リストを使用した無限リストの取

り扱いが可能になる、本来必要のない無駄な計算を省

けるなどのメリットがあります。

Page 101: Java SE 再入門

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);

}

Page 102: Java SE 再入門

Java SE 再入門

Stream の中間操作

102

ストリームに対して、以下のような中間操作が可能です。

戻り値は全てストリームです。

中間操作 概要

filter 指定された条件に一致するものを抽出します。

map ストリームの各要素に指定された関数を適用した結果を返します。

flatMap ストリームの各要素に指定された関数を適用した結果得られたストリームを纏めたストリームを返します。

distinct Object.equals(Object) による重複を除いた要素を抽出します。

sorted ストリームの各要素をソートした結果を返します。

peek ストリームをそのまま返します。デバッグ用途などで、各要素に対して副作用を伴う処理を実行する場合に使用します。

limit 要素を指定された最大サイズ以内の長さに切り詰めた結果を返します。

skip 指定された最初の n 個の要素を破棄した結果を返します。

Page 103: Java SE 再入門

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

Page 104: Java SE 再入門

Java SE 再入門

Stateless/Statefull な操作

104

ストリームの中間操作には、ステートレス操作とステー

トフル操作の 2 種類の操作が存在します。

ステートレス操作 (Stateless Operation)ステートレス操作 (filter, map, flatMap) は、各要素を処理する際に、

他の要素の影響を受けない操作です。ステートレスな中間操作のみを含

むパイプラインは、順次処理、並列処理のいずれであっても、最小限の

データ・バッファリングで単一パスで処理できます。

ステートフル操作 (Statefull Operation)ステートフル操作 (distinct, sorted, limit, skip) は、各要素を処理する際に、他の要素の影響を受ける操作です。その為、ステートフルな中間操作を並列処理で行った場合は、処理効率が悪化する可能性があるので注意が必要です。

Page 105: Java SE 再入門

Java SE 再入門

Stream の終端操作

105

ストリームに対して、以下のような終端操作が可能です。

複数回の終端操作を行うと例外が発生します。

終端操作 概要

forEach ストリームの各要素に対してアクションを実行します。

toArray ストリームの要素を含む配列を返します。

reduce ストリームの要素に対してリダクション操作を実行します。

collect ストリームの要素に対して可変リダクション操作を実行します。

min 指定されたComparatorに従ってストリームの最小要素を返します。

max 指定されたComparatorに従ってストリームの最大要素を返します。

count ストリームの要素数を返します。

anyMatch 条件に一致する要素が存在する場合に true を返します。

allMatch 全ての要素が条件に一致する場合に true を返します。

noneMatch 全ての要素が条件に一致しない場合に true を返します。

Page 106: Java SE 再入門

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 メ

ソッドが定義されています。

Page 107: Java SE 再入門

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 を返します。

Page 108: Java SE 再入門

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]

Page 109: Java SE 再入門

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要素に同じ型の複数の注釈を付加

Page 110: Java SE 再入門

Java SE 再入門

Optional

110

Optional は、 T 型の値を一つだけ保持できる

イミュータブルなコンテナクラスです。

null の可能性のある値をラップすることにより

null チェックの冗長な記述を排除可能で、基本

データ型用の OptionalInt、OptionalDouble、

OptionalLong クラスも提供されています。

Stream API には、Optional 型を返す終端メ

ソッドが多数存在するため、流れるように処理

を記述できます。

Page 111: Java SE 再入門

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));

}}

あうえ

Page 112: Java SE 再入門

Java SE 再入門

JavaFX

112

JavaFX は、JVM 上で動作する GUI アプリケー

ションのプラットフォームです。

ハードウェアアクセラレーション対応の軽量 Java

UI プラットフォームを提供する目的で設計されて

おり、Swing アプリケーション内で JavaFX を使

用して、既存のプリケーションを拡張することも可

能です。

標準技術である XML (FXML) や CSS を使用した

スタイリングが可能で、JavaFX Scene Builder と

言う GUI ツールが無償で提供されています。

Page 113: Java SE 再入門

Java SE 再入門

JavaFX Sample

113

Oracle 社の Java SE Downloads サイトから、サ

ンプルアプリケーションのダウンロードが可能です。

http://www.oracle.com/technetwork/java/javase/downloads/index.html

Page 114: Java SE 再入門

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, …

Page 115: Java SE 再入門

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 ファイルを実行することも可能です。

Page 116: Java SE 再入門

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 から解放されます。

Page 117: Java SE 再入門

Java SE 再入門

おまけ

117

Page 118: Java SE 再入門

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日時点)

Page 119: Java SE 再入門

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 サーバによる

定期監視により、適切なリソース管理を行うことが可

能になります。

Page 120: Java SE 再入門

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

Page 121: Java SE 再入門

Java SE 再入門

Java 関連のお勧め書籍

121

タイトル : Java逆引きレシピ

出版社 : 翔泳社

著者 : 竹添 直樹, 高橋 和也

織田 翔, 島本 多可子

発売日 : 2014/4/22

ページ数 : 576ページ

価格 : 3,024円 (税込)

タイトル : Effective Java 第2版

出版社 : 丸善出版

著者 : Joshua Bloch (著)

柴田 芳樹 (翻訳)

発売日 : 2014/3/11

ページ数 : 327ページ

価格 : 3,888円 (税込)

Page 122: Java SE 再入門

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

Page 123: Java SE 再入門

Java SE 再入門

まとめ

123

Page 124: Java SE 再入門

Java SE 再入門

• 強い静的型付けによる安心感とIDEによる支援

• 多数のプラットフォームで開発・動作が可能

• 高い互換性 (ソース・バイナリ・プラットフォーム) を維持しながらも着実に進化

• コンパイル速度、実行速度が速い

• JVM 上で動作する言語が増加しているが、既存の資産や知識をある程度は流用可能

• 情報や書籍、ライブラリが豊富

• プログラマの確保が比較的容易

Java の良いところ

124

Page 125: Java SE 再入門

Java SE 再入門

• コードが冗長になりがち

• NPE、ヌルポ

• 互換性を重要視するがゆえに言語の進化のスピードが遅い

• 膨大な数のライブラリやフレームワークが存在するがゆえに取捨選択が必要

• メジャー言語であるがゆえにプログラマのスキルの差が激しい

• 若者の Java 離れが顕著

Java の良くないところ

125

Page 126: Java SE 再入門

Java SE 再入門

世の中には多数の開発言語やライブラリ

が存在しますが、システム特性や開発規

模、メンバー構成などにより最適なアー

キテクチャは異なります。

Java は、規模が大きく、ライフサイクル

の長いアプリケーションの開発に適して

いると言われており、現時点でも主要な

選択肢の一つです。

126

最後に

Page 127: Java SE 再入門

Java SE 再入門

Modern Java

is the best Java.

127

Page 128: Java SE 再入門

Java SE 再入門

おわり

128