Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java SE 再入門

17,105 views

Published on

Java SE Re-Introduction

Published in: Technology
  • Be the first to comment

Java SE 再入門

  1. 1. JavaSE 再入門 To Java SE 8 from J2SE 1.4 September 2014 @minazou67
  2. 2. JavaSE再入門 はじめに 本スライドは、J2SE 1.4 からJava SE 8 の新機能について広く浅く解説し、 短時間でJava SE に関する知識を網羅 的に学習することを目的としています。 Java を学ぶきっかけになれば幸いです。 2 •本スライドでは、Java の基本的な事項(変数、演算子、制御構文、クラスなど) については取り扱いません。 •本スライドで紹介している機能が、Java SE の新機能の全てではありません。 •本スライドに掲載されている会社名、製品名、サービス名、ロゴは、各社・各団体の商標または登録商標です。
  3. 3. JavaSE再入門 Target •Java の知識がJava SE 6 付近で止まっている人 •Java 使ってるけど、実は よく知らないという人 •Java 初心者な人 3
  4. 4. JavaSE再入門 Goal Java SEの各バージョンの更新内容 を再確認することにより、既存の知 識を整理すると共に、最新バージョ ンのJava SE について学び、より モダンなプログラミングスタイルを 身に付けましょう。 4
  5. 5. JavaSE再入門 Java に関する あれやこれや 5
  6. 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. 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. 8. JavaSE再入門 JRE (Java Runtime Environment) Java 実行環境 Java 仮想マシン(JVM) と実行時ライブラリのセット JDK (Java Development Kit) Java 開発キット 開発ツール群と開発ツールが使用する非公開JRE のセット (非公開JRE は、開発ツールの実行のためだけに存在します。) Java 関連用語2 8
  9. 9. JavaSE再入門 JVM (Java Virtual Machine) Java 仮想マシン コンパイラが生成するJava バイトコードをプラットフォー ム固有のネイティブコードに変換して実行するソフトウェア Java 関連用語3 9 Java バイトコード(Java byte code) Java 仮想マシン用の命令セット ターゲットマシンのアーキテクチャに依存することなく実行 速度を向上させるための中間コード
  10. 10. JavaSE再入門 JNI (Java Native Interface) 他言語との相互運用のためのインタフェース仕様 Java から他言語で作成したライブラリのネイティブメソッド を呼び出すことが可能、またその逆も可能 Java 関連用語4 10 JNDI (Java Naming and Directory Interface) ネーミグサービスやディレクトリサービスを参照 するためのインタフェース仕様 LDAP やDNS, RMI, DataSource のようなサービスに対応
  11. 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. 12. JavaSE再入門 •オブジェクト指向プログラミング言語 •強い静的型付け言語 •Write Once, Run Anywhere (Platform 非依存) •コンパイラによりJava バイトコードを生成 •Java 仮想マシン(JVM) の上で動作 •ガベージコレクションによるメモリ管理 •C 言語ライクな構文 •マルチスレッドをサポート •高い互換性(ソース・バイナリ・プラットフォーム) Java の特徴 12
  13. 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. 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. 15. JavaSE再入門 JVM の起動モード 15 Client Mode クライアントアプリケーション用に最適化され、起動時間が 短くなり、メモリーフットプリントが減少 64bit 版のJDK では、このオプションを無視し、代わりにserver モードが選択されます。 Server Mode サーバーアプリケーション用に最適化され、起動時間は長く なるが、スループットが向上 マルチプロセッサで且つ、物理メモリが2GB 以上あるとサーバー クラスマシンとして検出され、server モードで起動されます。
  16. 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. 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
  18. 18. JavaSE再入門 J2SE 1.4 (JSR 59) 18
  19. 19. JavaSE再入門 •2002年2月6日にリリース •コードネームはMerlin •2008年10月にEOL •「Java Community Process (JCP)」のもとで開発 された初めてのJava プラットフォーム •言語仕様が大幅に拡張され、多数の新機能が追加さ れた •テーマは、信頼性、保守性、スケーラビリティ、パ フォーマンス、配備 J2SE 1.4 概要 19
  20. 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. 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. 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. 23. JavaSE再入門 アサーション(表明) は、プログラムが仕様通りに正しく動作し ているかを検証するための機能です。 以下のように、assert ステートメントで表明します。 Assertion 23 assertExpression1 ; assertExpression1 : Expression2 ; 式1 はboolean 型の式で、false の場合にAssertionError が発 生します。式2 はエラーの詳細メッセージを返す任意の式です。 java コマンドに「-ea」オプションを指定して実行するとアサー ションが有効になります。
  24. 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. 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. 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
  27. 27. JavaSE再入門 J2SE 5.0 (JSR 176) 27
  28. 28. JavaSE再入門 •2004年9月30日にリリース •コードネームはTiger •2009年10月にEOL •言語仕様が大幅に拡張され、多数の新機能が追加さ れた •テーマは、信頼性・可用性・保守性、パフォーマン スとスケーラビリティ、開発容易性、デスクトップ クライアント J2SE 5.0 概要 28
  29. 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. 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. 31. JavaSE再入門 •BigDecimal クラスの強化による小数点演算の強化 (固定精度の浮動小数点計算をサポート) •総称型(Generics) の追加による、コンパイラのタイプセーフ 検証の強化(キャスト作業の省略と型安全) •アノテーション(注釈) によるメタデータ機能の追加 (ボイラープレートコードの自動生成が可能) •列挙型(enum)、オートボクシング・アンボクシング、拡張 for 文、静的インポート、可変長引数による拡張 •Unicode 4.0 および補助文字のサポート •JAR ファイルを高圧縮する新しいPack200 形式をサポート (JAR ファイルのダウンロードサイズを大幅に削減) J2SE 5.0 の主な変更点1 31
  32. 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. 33. JavaSE再入門 ジェネリクスは、汎用的な型を取り扱うクラスやインター フェースに型パラメータリスト(型変数) を記述し、インス タンス化する際に型変数に型を与えることにより、コンパ イル時に型を保障しながら汎用的な型を取り扱うための仕 組みです。型変数はメソッドの宣言に対しても指定するこ とができます。 メジャーな実装例としては、コレクションAPI (java.util.List やjava.util.Map) が挙げられ、コードが型 安全になることにより、実行時のClassCastException が 抑制できます。 総称型(Generic type) 33
  34. 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 型パラメータリスト インスタンス生成時 に型を指定
  35. 35. JavaSE再入門 アノテーションはコードに付加するメタデータで、パッ ケージやクラス、メソッド、フィールドなどに適用するこ とができます。アノテーションは、プログラムの動作に影 響を与えません。 コードにメタデータを付加することの最大のメリットは、 コンパイラがメタデータを解釈することにより、コンパイ ル時に様々なチェックが可能になると言う点です。また、 外部の解析ツールやライブラリなどがメタデータを解釈す ることにより、コードやドキュメントの自動生成、DI など が実現可能となります。 注釈(Annotation) 35
  36. 36. JavaSE再入門 以下のような標準アノテーション型が提供されています。 標準Annotation 36 Override メソッドをオーバーライドしていることを明示する注釈 メソッドに対してのみ使用可能 Deprecated 非推奨であることを明示する注釈 非推奨のプログラム要素が使用されている場合に、コンパイラ警告とすることが可能 SuppressWarnings コンパイラ警告を抑制する注釈 以前のバージョンで書かれたコードに対して有効
  37. 37. JavaSE再入門 列挙した名前付き定数の集まりで構成されるクラスです。型安全 に特定データの集まりを扱えます。独自メソッドも定義可能です。 列挙型(Enum) 37 publicclassEnumSample { enumFruit { APPLE, ORANGE, GRAPE} publicstaticvoidmain(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); } } }
  38. 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. 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. 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. 41. JavaSE再入門 可変個数の引数を持つメソッドを定義可能になりました。 可変長引数 41 publicclassVariableLengthArgumentSample { // 可変長引数のメソッド publicstaticvoidvariableLengthArgument(String...args) { for(String arg: args) { System.out.println(arg); } } publicstaticvoidmain(String[] args) { variableLengthArgument("hoge", "fuga"); } }
  42. 42. JavaSE再入門 Java SE 6 (JSR 270) 42
  43. 43. JavaSE再入門 •2006年12月11日にリリース •コードネームはMustang •2013年2月にEOL •名称がJ2SE からJava SE に変更され、バージョ ン番号から小数点以下が削除された •大幅な言語仕様の変更はないが、多数の新機能の追 加や管理機能の強化、安定性の向上などが行われた •テーマは、互換性、開発容易性、診断機能・監視と 管理、エンタープライズデスクトップ、XML & Web サービス、透明性 Java SE 6 概要 43
  44. 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. 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. 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. 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. 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. 49. JavaSE再入門 Java VisualVMは、JVM 上で実行されているJava アプリケー ションのモニタリングやプロファイリング、トラブルシューティ ングを行うためのGUI ツールです。 JConsole、jstat、jinfo、jstack などの既存のスタンドアロンツー ルを連携させてJVM からデータを取得し、それらの情報を編集し て画面に表示します。プラグインによる機能追加も可能です。 Java VisualVM 49
  50. 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(); } }
  51. 51. JavaSE再入門 Java SE 7 (JSR 336) 51
  52. 52. JavaSE再入門 •2011年7月28日にリリース •コードネームはDolphin •2015年4月にEOL •Project Coin による多数の言語仕様の改善や新規 ファイルシステムAPI の提供、動的言語のサポー ト強化などが行われた •リファレンス実装がSun JDK からOpenJDK へ変 更された •テーマは、互換性、生産性、パフォーマンス、普遍 性、統合 Java SE 7 概要 52
  53. 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. 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. 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. 56. JavaSE再入門 •Java 仮想マシンにおける動的型付け言語のサポート強化 •動的型付け言語が高速に動作するバイトコード命令を追加 •動的言語サポートAPI (java.lang.invoke パッケージ) を追加 •新しい動的リンクメカニズムを提供 •静的な型情報がなくてもメソッド呼び出しの実行が可能 •JIT コンパイラの最適化の恩恵を享受 •Java SE 8 でサポート予定のラムダ式での使用も想定 Java SE 7 の主な変更点2 InvokeDynamic (Support for dynamically-typed languages) 56
  57. 57. JavaSE再入門 •invokestatic(静的メソッドの呼出し) •invokevirtual(クラスのメソッドの呼び出し) •invokeinterface(インターフェイスのメソッドの呼び出し) •invokespecial(コンストラクタ、プライベートメソッドの呼び出し) JVM のメソッド呼出し 57 既存のバイトコード命令(Java 用に最適化) 追加されたバイトコード命令(動的言語用に最適化) •invokedynamic(動的型付け言語向けのメソッドの呼び出し) •命令に紐付く処理を言語処理系が独自に選択可能 •命令に紐付く処理を実行時に変更可能
  58. 58. JavaSE再入門 •バイナリリテラルを利用可能 (「0b」または「0B」を接頭辞にすることで2 進数を表現) •数値リテラルにアンダースコアを利用可能(可読性を向上) •switch 文のcase ラベルに文字列を使用可能 •コンストラクタ呼び出し時の型推論をサポート (ダイヤモンド演算子) •リソース管理用構文の追加(try-with-resources) •例外のマルチキャッチと再スローについての改善 •可変長引数メソッド呼び出しの警告の抑制 (メソッド呼び出し側ではなく宣言側に警告を出力するように変更) Java SE 7 の主な変更点3 Project Coin (Small language enhancements) 58
  59. 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. 60. JavaSE再入門 Project Coin switch 文のcase ラベルに文字列を使用可能 publicvoidstringInSwitch() { Stringtext= "hoge"; switch(text) { case"fuga": break; case"piyo": break; default: break; } }
  61. 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. 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. 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. 64. JavaSE再入門 Project Coin 64 例外の再スローの改善 // Exception 型ではなくより詳細な型を宣言可能 publicvoidrethrow(String name) throwsNoSuchFieldException, SecurityException{ try{ if(name.equals("First")) { thrownewNoSuchFieldException(); } else{ thrownewSecurityException(); } } catch(Exceptione) { // キャッチしてそのまま再スロー throwe; } } 再スローする例外の型が条件を満たしているかコンパイラが確認
  65. 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. 66. JavaSE再入門 Java Flight Recorder 66 Java Flight Recorder は、JRockit VM に付属するJVM と実行 中のアプリケーションに関する詳細情報を記録ためのツールです。 Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン ドルされています。 JVM 内にメモリなどの稼働状況を監視する機能を内蔵し、それ らが低負荷で動作することより、本番環境での常時記録が可能と なっており、問題発生時に迅速な対応を行うことが可能です。
  67. 67. JavaSE再入門 Java Mission Control 67 Java Mission Control は、Java アプリケーションの管理、モニ タリング、プロファイルおよびトラブルシューティングを行うた めのツールスイートです。 Java HotSpot VM でも、Java SE 7 Update40 からJDKにバン ドルされています。 JMX コンソールとJava Flight Recorder から構成されており、 プラグインを簡単にインストールできます。
  68. 68. JavaSE再入門 VisualVM とJMC の違い 68 Java VisualVM とJava Mission Control は、非常に よく似たツールですが、いくつかの違いがあります。 Java VisualVM •プラグインが豊富 •無償で利用可能 Java Mission Control •基本機能が豊富 •強力な監視機能 •JVMの有償サポートが必要(開発用途での利用は無料)
  69. 69. JavaSE再入門 java.util.Objects 69 静的メソッドのみで構成されている便利なユーティリ ティークラスが提供されました。 http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html
  70. 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 領域に割り当てる方式 アプリケーション停止時間は短縮するがスループットは低下
  71. 71. JavaSE再入門 Java SE 8 (JSR 337) 71
  72. 72. JavaSE再入門 •2014年3月18日にリリース •コードネームは存在しない •2017年3月にEOL 予定 •ラムダ式の導入や新しいJavaScript エンジンの導 入、JavaFX の統合などが行われた •Compact プロファイルの導入により、Java SE プ ラットフォームをサブセット形式で提供可能になっ た •テーマは存在しない Java SE 8 概要 72
  73. 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
  74. 74. JavaSE再入門 •型アノテーションにより、宣言部に限らず、型が使 用される任意の場所にアノテーションを適用可能 •java.lang.annotation.ElementType に TYPE_PARAMETER (型パラメータ宣言) と TYPE_USE (型使用箇所) が追加 •型チェック・フレームワークをコンパイラのプラグ インとして使用し、アノテーションが付加された型 のチェックが可能 Java SE 8 の主な変更点1 型アノテーション(Annotations on types) 74
  75. 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. 76. JavaSE再入門 Checker Framework 76 Java SE 8 には型固有のアノテーションは定義されていませんが、 Checker Framework などの外部ライブラリにより、特定の条件 を検証できるアノテーションが提供されています。また、 Checker Framework 用のEclipse プラグインやMaven プラグ インも提供されています。 例えば、@NonNull アノテーションを型に適用した場合は、コン パイル時にコードパスがnull 値を受け取る可能性があるかどうか を検証できます。
  77. 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
  78. 78. JavaSE再入門 新しい日付と時間のクラス 78 http://docs.oracle.com/javase/jp/8/api/java/time/package-summary.html
  79. 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. 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. 81. JavaSE再入門 •単一メソッドのインタフェースのインスタンス生成を簡単に書 くための新しいシンタックス(簡易記法) •ラムダ式を使うと、従来よりも短いコードで、処理の流れが明 瞭なコードを記述することが可能 •関数型インターフェースの導入 •メソッド参照、コンストラクタ参照の導入(既存のメソッドや コンストラクタをラムダ式のように使用することが可能) •仮想拡張メソッド(インタフェースのデフォルト実装) の導入 •Java 8 のラムダ式はクロージャではない(レキシカルスコー プを伴わない) Java SE 8 の主な変更点3 ラムダ式(Lambda expressions) 81
  82. 82. JavaSE再入門 関数型インターフェース 82 関数型インターフェースは、実装するべきメ ソッドが1つしかないインタフェースで、ラムダ 式やメソッド参照のターゲットとなる型です。 java.util.function パッケージで汎用的な関数型 インタフェースがいくつか提供されていますが、 独自に定義することも可能です。 条件に合致すれば関数型インターフェースとし て扱われますが、FunctionalInterface アノテー ションを付与することで明示化し、不適合の場 合にコンパイルエラーとすることもできます。
  83. 83. JavaSE再入門 SAM Type 83 SAM Type はSingle-Abstract-Method Type の略で、抽象メソッドを一つだけ持っているク ラスやインターフェースの総称です。 デフォルトメソッドを含む具象メソッドの有無 や個数については問われません。 関数型インターフェースは、SAM Type なイン ターフェースになります。
  84. 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. 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. 86. JavaSE再入門 仮想拡張メソッド 86 仮想拡張メソッドは、インタフェースのメソッ ドにデフォルトの振る舞いを記述できるように するものです。 仮想拡張メソッドの導入により、既存のイン ターフェースにメソッドを追加した場合に、実 装クラスにメソッドのオーバーライドを強要す ることがなくなり、互換性を維持できます。 また、仮想拡張メソッドの導入により、Java でも実質的に多重継承が可能になりました。
  87. 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. 88. JavaSE再入門 Static Methods の使用例 88 publicclassStaticMethodSample { // 静的メソッドを定義したインターフェース publicinterfaceMyInterface { publicstaticString find() { return"10"; } } // 静的メソッドの呼び出し publicstaticvoidmain(String[] args) { System.out.println(MyInterface.find()); // 10 } }
  89. 89. JavaSE再入門 仮想拡張メソッドの特徴 89 •インターフェースのデフォルトメソッドは、実装ク ラス側でオーバーライド可能 •C++とは異なり、状態の多重継承はできない (インターフェースではインスタンス変数を保有できないため) •菱形継承によるメソッド名の重複問題は、呼び出し 順による優先順位付けで解決 •優先順位が判断できない場合は、コンパイルエラー interfaceA interfaceB interfaceC classD interfaceB とinterfaceC に同名のデフォルト メソッドが存在する場合はコンパイルエラー。
  90. 90. JavaSE再入門 ラムダ式(Lambda Expressions) 90 ラムダ式は、関数型インタフェースの実装匿名クラス の簡易記法です。ラムダ式は以下の構文で記述します。 (引数) -> { 処理} ラムダ式の引数は、実装する関数型インタフェースの メソッドの引数と同じになります。 ラムダ式導入のメリットは、後述するStream API で ラムダ式を使用することにより、内部イテレータを使 用した並列処理が簡潔に記述可能になることです。
  91. 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. 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. 93. JavaSE再入門 クロージャ(Closure) 93 Closure (関数閉包) は、プログラミング言語における 関数オブジェクトの一種。いくつかの言語ではラムダ 式や無名関数で実現している。引数以外の変数を実行 時の環境ではなく、自身が定義された環境(静的ス コープ)において解決することを特徴とする。関数と それを評価する環境のペアであるともいえる。 (Wikipedia より引用) Java のラムダ式は、静的スコープ(レキシカルスコー プ) の扱いが制限されている(実質的にfinal な変数に しかアクセスできない) ため、他言語で一般的に「ク ロージャ」と呼ばれている機能とは多少異なります。
  94. 94. JavaSE再入門 JavaScript でのClosure 実装例 94 1 2 3 functionouter() { vari= 0; i++; returnfunction() { returni++; }; } varfunc= outer(); print(func()); print(func()); print(func());
  95. 95. JavaSE再入門 ラムダ式とinvokedynamic 95 ラムダ式の実行は、Java SE 7 で導入されたバイト コード命令のinvokedynamic を使用しています。 invokedynamic を使用することにより、ラムダ式の クラスはコンパイル時ではなく実行時に生成されます。 クラスの生成を実行時に行うことで、アプリケーショ ン起動時のクラスロード処理を抑制できるメリットが あります。 Java SE 8 のアプリケーションで頻繁に使用されるで あろうStream API は、ラムダ式により大量のクラス を生成するため恩恵が大きい。
  96. 96. JavaSE再入門 •要素のストリームに対する関数型スタイルの操作をサポートす るStream API が追加(コレクションのバルク処理が可能に) •@Repeatable アノテーションにより、1要素に同じ型の複数 の注釈を付加することが可能に •リフレクションによるメソッドやコンストラクタの引数情報 (引数名等) の取得が可能に •Optional 型の導入 •符号付き整数を符号なし整数として取り扱うメソッドをラッ パークラス(Integer, Long クラス等)に追加 •GUI フレームワークとしてJavaFX 8 が統合 (java コマンドによりJavaFX アプリケーションが起動可能) Java SE 8 の主な変更点4 96
  97. 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. 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. 99. JavaSE再入門 Stream API 99 Stream API は、要素の集まり(配列やコレクションな ど) に対するさまざまな操作を抽象化したAPI です。 ストリームの操作は中間操作と終端操作に分かれ、こ れらを組み合わせてストリーム・パイプラインを形成 します。 中間操作は新しいストリームを返しますが、これらの 操作は常に遅延されます。 ラムダ式を利用したストリームの遅延評価アプローチ によって、マルチコア・プロセッサを効率的に使用す る並列処理の記述が容易になりました。
  100. 100. JavaSE再入門 遅延評価(lazy evaluation) 100 遅延評価とは、実際にその値が必要になるまで、その 値に対する計算処理を遅らせるという評価手法の一つ で、関数型言語界隈でよく使用される言葉です。 Java のStream API やラムダ式における遅延評価は、 正確には遅延評価ではなく遅延処理と呼ぶべきもので あるため、安易に遅延評価という言葉は使わないほう が良さそうです。 遅延処理には、遅延リストを使用した無限リストの取 り扱いが可能になる、本来必要のない無駄な計算を省 けるなどのメリットがあります。
  101. 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. 102. JavaSE再入門 Stream の中間操作 102 ストリームに対して、以下のような中間操作が可能です。 戻り値は全てストリームです。 中間操作 概要 filter 指定された条件に一致するものを抽出します。 map ストリームの各要素に指定された関数を適用した結果を返します。 flatMap ストリームの各要素に指定された関数を適用した結果得られたスト リームを纏めたストリームを返します。 distinct Object.equals(Object) による重複を除いた要素を抽出します。 sorted ストリームの各要素をソートした結果を返します。 peek ストリームをそのまま返します。デバッグ用途などで、各要素に対し て副作用を伴う処理を実行する場合に使用します。 limit 要素を指定された最大サイズ以内の長さに切り詰めた結果を返します。 skip 指定された最初のn 個の要素を破棄した結果を返します。
  103. 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. 104. JavaSE再入門 Stateless/Statefullな操作 104 ストリームの中間操作には、ステートレス操作とステー トフル操作の2 種類の操作が存在します。 ステートレス操作(Stateless Operation) ステートレス操作(filter, map, flatMap) は、各要素を処理する際に、 他の要素の影響を受けない操作です。ステートレスな中間操作のみを含 むパイプラインは、順次処理、並列処理のいずれであっても、最小限の データ・バッファリングで単一パスで処理できます。 ステートフル操作(Statefull Operation) ステートフル操作(distinct, sorted, limit, skip) は、各要素 を処理する際に、他の要素の影響を受ける操作です。その為、 ステートフルな中間操作を並列処理で行った場合は、処理効率 が悪化する可能性があるので注意が必要です。
  105. 105. JavaSE再入門 Stream の終端操作 105 ストリームに対して、以下のような終端操作が可能です。 複数回の終端操作を行うと例外が発生します。 終端操作 概要 forEach ストリームの各要素に対してアクションを実行します。 toArray ストリームの要素を含む配列を返します。 reduce ストリームの要素に対してリダクション操作を実行します。 collect ストリームの要素に対して可変リダクション操作を実行します。 min 指定されたComparatorに従ってストリームの最小要素を返します。 max 指定されたComparatorに従ってストリームの最大要素を返します。 count ストリームの要素数を返します。 anyMatch 条件に一致する要素が存在する場合にtrue を返します。 allMatch 全ての要素が条件に一致する場合にtrue を返します。 noneMatch 全ての要素が条件に一致しない場合にtrue を返します。
  106. 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. 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. 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. 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. 110. JavaSE再入門 Optional 110 Optional は、T 型の値を一つだけ保持できる イミュータブルなコンテナクラスです。 null の可能性のある値をラップすることにより null チェックの冗長な記述を排除可能で、基本 データ型用のOptionalInt、OptionalDouble、 OptionalLong クラスも提供されています。 Stream API には、Optional 型を返す終端メ ソッドが多数存在するため、流れるように処理 を記述できます。
  111. 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. 112. JavaSE再入門 JavaFX 112 JavaFX は、JVM 上で動作するGUI アプリケー ションのプラットフォームです。 ハードウェアアクセラレーション対応の軽量Java UI プラットフォームを提供する目的で設計されて おり、Swing アプリケーション内でJavaFX を使 用して、既存のプリケーションを拡張することも可 能です。 標準技術であるXML (FXML) やCSS を使用した スタイリングが可能で、JavaFX Scene Builder と 言うGUI ツールが無償で提供されています。
  113. 113. JavaSE再入門 JavaFXSample 113 Oracle 社のJava SE Downloads サイトから、サ ンプルアプリケーションのダウンロードが可能です。 http://www.oracle.com/technetwork/java/javase/downloads/index.html
  114. 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. 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. 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 から解放されます。
  117. 117. JavaSE再入門 おまけ 117
  118. 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. 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. 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. 121. JavaSE再入門 Java 関連のお勧め書籍 121 タイトル: Java逆引きレシピ 出版社: 翔泳社 著者: 竹添直樹, 高橋和也 織田翔, 島本多可子 発売日: 2014/4/22 ページ数: 576ページ 価格: 3,024円(税込) タイトル: Effective Java 第2版 出版社: 丸善出版 著者: Joshua Bloch (著) 柴田芳樹(翻訳) 発売日: 2014/3/11 ページ数: 327ページ 価格: 3,888円(税込)
  122. 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
  123. 123. JavaSE再入門 まとめ 123
  124. 124. JavaSE再入門 •強い静的型付けによる安心感とIDEによる支援 •多数のプラットフォームで開発・動作が可能 •高い互換性(ソース・バイナリ・プラット フォーム)を維持しながらも着実に進化 •コンパイル速度、実行速度が速い •JVM 上で動作する言語が増加しているが、既 存の資産や知識をある程度は流用可能 •情報や書籍、ライブラリが豊富 •プログラマの確保が比較的容易 Java の良いところ 124
  125. 125. JavaSE再入門 •コードが冗長になりがち •NPE、ヌルポ •互換性を重要視するがゆえに言語の進化のス ピードが遅い •膨大な数のライブラリやフレームワークが存 在するがゆえに取捨選択が必要 •メジャー言語であるがゆえにプログラマのス キルの差が激しい •若者のJava 離れが顕著 Java の良くないところ 125
  126. 126. JavaSE再入門 世の中には多数の開発言語やライブラリ が存在しますが、システム特性や開発規 模、メンバー構成などにより最適なアー キテクチャは異なります。 Java は、規模が大きく、ライフサイクル の長いアプリケーションの開発に適して いると言われており、現時点でも主要な 選択肢の一つです。 126 最後に
  127. 127. JavaSE再入門 Modern Java is the best Java. 127
  128. 128. JavaSE再入門 おわり 128

×