Java9-quick-guide

提供:Dev Guides
移動先:案内検索

Java 9-概要

JAVA 9(別名jdk 1.9)は、JAVAプログラミング言語開発のメジャーリリースです。 初期バージョンは2017年9月21日にリリースされました。 Java 9リリースの主な目標は次のとおりです-

  • JDKおよびJava Standard Editionプラットフォームを、小さなコンピューティングデバイスにうまく変換できるという意味で、モジュールベースにすること。
  • JDKおよびJava実装の全体的なセキュリティを向上させるため。
  • Javaコードライブラリと大規模アプリケーションのビルドプロセスとメンテナンスを、JAVA SEおよびEEプラットフォームで簡単に行えるようにするため。
  • プラットフォームとJDKの両方に簡単に適用できるJavaプラットフォームの標準モジュールシステムを設計および実装する。

新機能

Java 8には90以上の拡張機能が追加されています。最も重要な拡張機能については以下で説明します-

  • モジュール-モジュールとして導入された新しい種類のJavaプログラミングコンポーネント。名前付きの自己記述的なコードとデータのコレクションです。
  • * REPL(JShell)*-Javaプラットフォームに追加されたRead-Eval-Print Loop(REPL)機能。
  • * HTTP 2クライアント*-WebsocketとHTTP 2ストリームおよびサーバープッシュ機能をサポートする新しいHTTPClient API。
  • *改良されたJavaDocs *-HTML5出力生成をサポートします。 生成されたAPIドキュメントに検索ボックスを提供します。
  • Multirelease JAR -JAR形式を拡張して、クラスファイルの複数のJavaリリース固有バージョンが単一のアーカイブに共存できるようにします。
  • コレクションファクトリメソッド-List、Set、およびMapインターフェイス用の新しい静的ファクトリメソッドは、これらのコレクションの不変インスタンスを作成します。
  • プライベートインターフェイスメソッド-プライベートおよびプライベート静的メソッドを備えた拡張インターフェイス。
  • プロセスAPIの改善-オペレーティングシステムプロセスを制御および管理するためのAPIの改善。
  • ストリームAPIの改善-オブジェクトシリアル化データの着信ストリームをフィルター処理できるようにすることで、セキュリティと堅牢性が強化されました。
  • リソースの試用の改善-try-with-resourcesステートメントで最終変数をリソースとして使用できるようになりました。
  • * @ Deprecatedアノテーションの強化*-@Deprecatedアノテーションは、APIのステータスと意図した処理に関する詳細情報を提供するために改訂されました。
  • 内部クラスのダイヤモンド演算子-推論された型の引数型を指定できる場合、匿名クラスでダイヤモンド演算子を使用できるようにします。
  • オプションのクラスの改善-java.util.Optionalクラスに新しい便利なメソッドが追加されました。
  • Multiresolution Image API -異なる解像度の一連の画像を単一の多重解像度画像にカプセル化できます。
  • * CompletableFuture APIの改善*-CompletableFutureクラスの非同期メカニズムは、ProcessHandle.onExitメソッドでプロセスが終了するときにアクションを実行できます。
  • *軽量JSON *-Java 9のjsonを介してドキュメントとデータストリームを消費および生成するために導入された軽量API。
  • *リアクティブストリームAPI *-Java 9のリアクティブプログラミングをサポートするために、Java SE 9の新しいリアクティブストリームAPIが導入されました。

Java 9-環境設定

ローカル環境のセットアップ

Javaプログラミング言語用に独自の環境をセットアップする場合は、このセクションでプロセス全体をガイドします。 Java環境をセットアップするには、以下の手順に従ってください。

Java SEは無料でダウンロードできます。 https://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520l [ここをクリック]をダウンロードするには、オペレーティングシステムと互換性のあるバージョンをダウンロードしてください。

指示に従ってJavaをダウンロードし、*。exe *を実行してJavaをマシンにインストールします。 マシンにJavaをインストールしたら、正しいインストールディレクトリを指すように環境変数を設定する必要があります。

Windows 2000/XPのパスのセットアップ

Javaをc:\ Program Files \ java \ jdkディレクトリにインストールしたと仮定します-

  • 「マイコンピュータ」を右クリックして、「プロパティ」を選択します。
  • 「詳細」タブの下の「環境変数」ボタンをクリックします。
  • 次に、「パス」変数を​​編集し、最後にJava実行可能ディレクトリへのパスを追加します。 たとえば、パスが現在 `+ C:\ Windows \ System32 +`に設定されている場合、次のように編集します
C:\Windows\System32;c:\Program Files\java\jdk\bin

Windows 95/98/MEのパスのセットアップ

Javaをc:\ Program Files \ java \ jdkディレクトリにインストールしたと仮定します-

  • 「C:\ autoexec.bat」ファイルを編集し、最後に次の行を追加します-
SET PATH = %PATH%;C:\Program Files\java\jdk\bin

Linux、UNIX、Solaris、FreeBSDのパスのセットアップ

環境変数PATHは、Javaバイナリがインストールされている場所を指すように設定する必要があります。 これがうまくいかない場合は、シェルのドキュメントを参照してください。

たとえば、シェルとしてbashを使用する場合、*。bashrc *の最後に次の行を追加します-

export PATH =/path/to/java:$PATH'

人気のあるJavaエディター

Javaプログラムを作成するには、テキストエディターが必要です。 市場にはさらに洗練されたIDEがあります。 最も人気のあるものを以下に簡単に説明します-

IDEまたは統合開発環境は、ソースコードエディター、ビルドツール、デバッガーなど、プログラミングを支援するすべての一般的なツールと機能を提供します。

Java 9-モジュールシステム

Java 9、モジュールと呼ばれる新しい種類のプログラミングコンポーネントが導入されました。 モジュールは、自己記述的なコードとデータのコレクションであり、それを識別するための名前があります。

特徴

モジュールコンポーネントでは、Java 9で次の機能強化が追加されました-

  • 新しいオプションのフェーズであるリンク時間が導入されました。 このフェーズは、コンパイル時と実行時の中間です。 このフェーズでは、jlinkツールを使用してカスタムランタイムイメージを作成し、一連のモジュールを組み立てて最適化できます。
  • javac、jlink、およびjavaには、モジュールパスを指定する追加オプションがあり、モジュールの定義をさらに特定します。
  • モジュール形式のJARとして更新されたJAR形式。ルートディレクトリにmodule-info.classファイルが含まれています。
  • 導入されたJMOD形式、ネイティブコードと構成ファイルを含めることができるパッケージ化形式(JARに類似)。

モジュールを作成する

モジュールを作成する手順に従って、com.finddevguides.greetingsと言います。

ステップ1

C:\> JAVA \ srcフォルダーを作成します。 次に、作成するモジュールの名前と同じフォルダーcom.finddevguides.greetingsを作成します。

ステップ2

C:\> JAVA \ src \ com.finddevguides.greetingsフォルダーに次のコードでmodule-info.javaを作成します。

module-info.java

module com.finddevguides.greetings { }

module-info.javaは、モジュールの作成に使用されるファイルです。 このステップでは、com.finddevguides.greetingsという名前のモジュールを作成しました。 慣例により、このファイルはモジュール名と同じ名前のフォルダーに存在する必要があります。

ステップ3

モジュールにソースコードを追加します。 C:\> JAVA \ src \ com.finddevguides.greetings \ com \ finddevguides \ greetingsフォルダーに次のコードでJava9Tester.javaを作成します。

Java9Tester.java

package com.finddevguides.greetings;

public class Java9Tester {
   public static void main(String[] args) {
      System.out.println("Hello World!");
   }
}

慣例により、モジュールのソースコードは、モジュールの名前である同じディレクトリにあります。

ステップ4

C:\> JAVA \ modsフォルダーを作成します。 次に、作成したモジュールの名前と同じフォルダーcom.finddevguides.greetingsを作成します。 モジュールをmodsディレクトリにコンパイルします。

C:/> JAVA > javac -d mods/com.finddevguides.greetings
   src/com.finddevguides.greetings/module-info.java
   src/com.finddevguides.greetings/com/finddevguides/greetings/Java9Tester.java

ステップ5

モジュールを実行して結果を確認しましょう。 次のコマンドを実行します。

C:/>JAVA>java --module-path mods -m com.finddevguides.greetings/com.finddevguides.greetings.Java9Tester

ここで、module-pathはmodとしてモジュールの場所を提供し、-mはメインモジュールを示します。

出力

コンソールに次の出力を印刷します。

Hello World!

Java 9-REPL(JShell)

REPLはRead-Eval-Print Loopの略です。 JShellでは、javaにREPL機能があります。 REPLを使用すると、javacを使用してコンパイルせずにJavaベースのロジックをコーディングおよびテストし、計算結果を直接確認できます。

JShellの実行

コマンドプロンプトを開き、jshellと入力します。

$ jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type:/help intro
jshell>

JShellコマンドの表示

jshellコマンドが実行を開始したら、/helpと入力します。

jshell>/help
|  Type a Java language expression, statement, or declaration.
|  Or type one of the following commands:
| /list [<name or id>|-all|-start]
|  list the source you have typed
| /edit <name or id>
|  edit a source entry referenced by name or id
| /drop <name or id>
|  delete a source entry referenced by name or id
| /save [-all|-history|-start] <file>
|  Save snippet source to a file.
| /open <file>
|  open a file as source input
| /vars [<name or id>|-all|-start]
|  list the declared variables and their values
| /methods [<name or id>|-all|-start]
|  list the declared methods and their signatures
| /types [<name or id>|-all|-start]
|  list the declared types
| /imports
|  list the imported items

JShellコマンドの実行

jshellコマンドの実行が開始されたら/importsと入力し、使用されたインポートを確認します。

jshell>/imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
jshell>

JShellでの計算の実行。

JShellで簡単な計算を実行してみてください。

jshell> 3+1
$1 ==> 4
jshell> 13%7
$2 ==> 6
jshell> $2
$2 ==> 6
jshell>

JShellで関数を作成して使用する

関数doubled()を作成して、intを取得し、その倍増した値を返します。

jshell> int doubled(int i){ return i*2;}
|  created method doubled(int)
jshell> doubled(6)
$3 ==> 12
jshell>

JShellを終了する

/exitと入力します。

jshell>/exit
| Goodbye

Java 9-JavaDocsの改善

Javadocは、javadocツールを使用して生成できます。 現在、HTML 4.0形式のドキュメントを生成します。 Java 9では、コマンドライン引数で-html5オプションを使用して、html 5形式のドキュメントを生成できます。

古いスタイルのJavaドキュメント

C:/JAVAフォルダーの次のコードを検討してください。

Tester.java

/**
 *@author MahKumar
 * @version 0.1
*/
public class Tester {
  /**
 *Default method to be run to print
     * <p>Hello world</p>
 *@param args command line arguments
  */
   public static void main(String []args) {
      System.out.println("Hello World");
   }
}

ここで、jdk 7のjavadocツールを実行してドキュメントを生成します。

C:\JAVA>javadoc -d C:/JAVA Tester.java
Loading source file tester.java...
Constructing Javadoc information...
Standard Doclet version 1.7.0_21
Building tree for all the packages and classes...
Generating C:\JAVA\Testerl...
Generating C:\JAVA\package-framel...
Generating C:\JAVA\package-summaryl...
Generating C:\JAVA\package-treel...
Generating C:\JAVA\constant-valuesl...
Building index for all the packages and classes...
Generating C:\JAVA\overview-treel...
Generating C:\JAVA\index-alll...
Generating C:\JAVA\deprecated-listl...
Building index for all classes...
Generating C:\JAVA\allclasses-framel...
Generating C:\JAVA\allclasses-noframel...
Generating C:\JAVA\indexl...
Generating C:\JAVA\help-docl...

C:/JAVAディレクトリにjavaドキュメントページが作成され、次の出力が表示されます。

javadoc output

検索とHTML5をサポートする新しいJavaドキュメント

-html5フラグを指定してjdk 9のjavadocツールを実行し、新しいタイプのドキュメントを生成します。

C:\JAVA> javadoc -d C:/JAVA -html5 Tester.java
Loading source file Tester.java...
Constructing Javadoc information...
Standard Doclet version 9.0.1
Building tree for all the packages and classes...
Generating C:\JAVA\Testerl...
Generating C:\JAVA\package-framel...
Generating C:\JAVA\package-summaryl...
Generating C:\JAVA\package-treel...
Generating C:\JAVA\constant-valuesl...
Building index for all the packages and classes...
Generating C:\JAVA\overview-treel...
Generating C:\JAVA\index-alll...
Generating C:\JAVA\deprecated-listl...
Building index for all classes...
Generating C:\JAVA\allclasses-framel...
Generating C:\JAVA\allclasses-framel...
Generating C:\JAVA\allclasses-noframel...
Generating C:\JAVA\allclasses-noframel...
Generating C:\JAVA\indexl...
Generating C:\JAVA\help-docl...

D:/testディレクトリに更新されたJavaドキュメントページが作成され、次の出力が表示されます。

java 9でのjavadoc出力

Java 9-マルチリリースJAR

Java 9では、jar形式が拡張され、プラットフォームごとに異なるバージョンのjavaクラスまたはリソースを維持および使用できるようになった新しい機能が導入されました。 JARでは、ファイルMANIFEST.MFファイルのメインセクションにエントリMulti-Release:trueがあります。 META-INFディレクトリには、バージョン固有のクラスとリソースファイルを格納するサブディレクトリ(Java 9では9から始まる)のバージョンサブディレクトリも含まれます。

この例では、マルチリリースjarを使用してTester.javaファイルの2つのバージョン(jdk 7用とjdk 9用)を作成し、異なるjdkバージョンで実行します。

ステップ

  • ステップ1 *-フォルダーc:/test/java7/com/finddevguidesを作成します。 次の内容でTest.javaを作成します-

Tester.java

package com.finddevguides;

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 7");
   }
}
  • ステップ2 *-フォルダーc:/test/java9/com/finddevguidesを作成します。 次の内容でTest.javaを作成します-

Tester.java

package com.finddevguides;

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 9");
   }
}

ソースコードをコンパイルします。

C:\test > javac --release 9 java9/com/finddevguides/Tester.java

C:\JAVA > javac --release 7 java7/com/finddevguides/Tester.java

マルチリリースjarを作成する

C:\JAVA > jar -c -f test.jar -C java7 . --release 9 -C java9.
Warning: entry META-INF/versions/9/com/finddevguides/Tester.java,
   multiple resources with same name

JDK 7で実行

C:\JAVA > java -cp test.jar com.finddevguides.Tester
Inside Java 7

JDK 9で実行

C:\JAVA > java -cp test.jar com.finddevguides.Tester
Inside Java 9

Java 9-コレクションファクトリメソッド

Java 9では、List、Set、およびMapインターフェイスに新しいファクトリメソッドが追加され、不変インスタンスが作成されます。 これらのファクトリメソッドは、より簡潔で簡潔な方法でコレクションを作成するための便利なファクトリメソッドです。

コレクションを作成する古い方法

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Tester {
   public static void main(String []args) {
      Set<String> set = new HashSet<>();
      set.add("A");
      set.add("B");
      set.add("C");
      set = Collections.unmodifiableSet(set);
      System.out.println(set);
      List<String> list = new ArrayList<>();

      list.add("A");
      list.add("B");
      list.add("C");
      list = Collections.unmodifiableList(list);
      System.out.println(list);
      Map<String, String> map = new HashMap<>();

      map.put("A","Apple");
      map.put("B","Boy");
      map.put("C","Cat");
      map = Collections.unmodifiableMap(map);
      System.out.println(map);
   }
}

出力

次の出力を印刷します。

[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}

新しい方法

Java 9では、次のメソッドが、オーバーロードされた対応物とともに、List、Set、およびMapインターフェイスに追加されます。

static <E> List<E> of(E e1, E e2, E e3);
static <E> Set<E>  of(E e1, E e2, E e3);
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3);
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

注意点

  • ListおよびSetインターフェイスの場合、of(…​)メソッドはオーバーロードされ、0〜10個のパラメーターとvar argsパラメーターを持つパラメーターが含まれます。
  • Mapインターフェイスの場合、of(…​)メソッドは、0〜10個のパラメーターを持つようにオーバーロードされます。
  • Mapインターフェースのパラメーターが10個を超える場合、ofEntries(…​)メソッドを使用して、var argsパラメーターを受け入れます。

コレクションを作成する新しい方法

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;

public class Tester {

   public static void main(String []args) {
      Set<String> set = Set.of("A", "B", "C");
      System.out.println(set);
      List<String> list = List.of("A", "B", "C");
      System.out.println(list);
      Map<String, String> map = Map.of("A","Apple","B","Boy","C","Cat");
      System.out.println(map);

      Map<String, String> map1 = Map.ofEntries (
         new AbstractMap.SimpleEntry<>("A","Apple"),
         new AbstractMap.SimpleEntry<>("B","Boy"),
         new AbstractMap.SimpleEntry<>("C","Cat"));
      System.out.println(map1);
   }
}

出力

次の出力を印刷します。

[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}
{A=Apple, B=Boy, C=Cat}

Java 9-プライベートインターフェイスメソッド

Java 8より前は、インターフェイスに次のタイプの変数/メソッドを含めることができます。

  • 定数変数
  • 抽象メソッド

したがって、インターフェイスにメソッドを実装することはできません。より正確には、Java 8より前のデフォルトの実装を実装することはできません。 例を見てください。

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");
      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}
final class LogOracle implements Logging {
   @Override
   public void logInfo(String message) {
      getConnection();
      System.out.println("Log Message : " + "INFO");
      closeConnection();
   }
   @Override
   public void logWarn(String message) {
      getConnection();
      System.out.println("Log Message : " + "WARN");
      closeConnection();
   }
   @Override
   public void logError(String message) {
      getConnection();
      System.out.println("Log Message : " + "ERROR");
      closeConnection();
   }
   @Override
   public void logFatal(String message) {
      getConnection();
      System.out.println("Log Message : " + "FATAL");
      closeConnection();
   }
   @Override
   public void getConnection() {
      System.out.println("Open Database connection");
   }
   @Override
   public void closeConnection() {
      System.out.println("Close Database connection");
   }
}
final class LogMySql implements Logging {
   @Override
   public void logInfo(String message) {
      getConnection();
      System.out.println("Log Message : " + "INFO");
      closeConnection();
   }
   @Override
   public void logWarn(String message) {
      getConnection();
      System.out.println("Log Message : " + "WARN");
      closeConnection();
   }
   @Override
   public void logError(String message) {
      getConnection();
      System.out.println("Log Message : " + "ERROR");
      closeConnection();
   }
   @Override
   public void logFatal(String message) {
      getConnection();
      System.out.println("Log Message : " + "FATAL");
      closeConnection();
   }
   @Override
   public void getConnection() {
      System.out.println("Open Database connection");
   }
   @Override
   public void closeConnection() {
      System.out.println("Close Database connection");
   }
}
interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   void logInfo(String message);
   void logWarn(String message);
   void logError(String message);
   void logFatal(String message);

   void getConnection();
   void closeConnection();
}

出力

次の出力が表示されます。

Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

上記の例では、各ログメソッドには独自の実装があります。 Java 8インターフェースでは、次のタイプの変数/メソッドを使用できます。

  • 定数変数
  • 抽象メソッド
  • デフォルトの方法
  • 静的メソッド

Java 8を使用して、インターフェイス自体にデフォルトの実装と静的メソッドを用意しましょう。

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");

      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}
final class LogOracle implements Logging {
}
final class LogMySql implements Logging {
}
interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   default void logInfo(String message) {
      getConnection();
      System.out.println("Log Message : " + "INFO");
      closeConnection();
   }
   default void logWarn(String message) {
      getConnection();
      System.out.println("Log Message : " + "WARN");
      closeConnection();
   }
   default void logError(String message) {
      getConnection();
      System.out.println("Log Message : " + "ERROR");
      closeConnection();
   }
   default void logFatal(String message) {
      getConnection();
      System.out.println("Log Message : " + "FATAL");
      closeConnection();
   }
   static void getConnection() {
      System.out.println("Open Database connection");
   }
   static void closeConnection() {
      System.out.println("Close Database connection");
   }
}

出力

次の出力が表示されます。

Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

上記の例では、繰り返しを繰り返しています。 Java 9インターフェースでは、次のタイプの変数/メソッドを使用できます。

  • 定数変数
  • 抽象メソッド
  • デフォルトの方法
  • 静的メソッド
  • プライベートメソッド
  • プライベート静的メソッド

プライベートメソッドを用意し、Java 9で使用しましょう。

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");

      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}
final class LogOracle implements Logging {
}
final class LogMySql implements Logging {
}
interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   private void log(String message, String prefix) {
      getConnection();
      System.out.println("Log Message : " + prefix);
      closeConnection();
   }
   default void logInfo(String message) {
      log(message, "INFO");
   }
   default void logWarn(String message) {
      log(message, "WARN");
   }
   default void logError(String message) {
      log(message, "ERROR");
   }
   default void logFatal(String message) {
      log(message, "FATAL");
   }
   private static void getConnection() {
      System.out.println("Open Database connection");
   }
   private static void closeConnection() {
      System.out.println("Close Database connection");
   }
}

出力

次の出力が表示されます。

Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

Java 9-プロセスAPIの改善

Java 9では、オペレーティングシステムプロセスの制御と管理を担当するプロセスAPIが大幅に改善されました。 ProcessHandleクラスは、プロセスのネイティブプロセスID、開始時間、累積CPU時間、引数、コマンド、ユーザー、親プロセス、および子孫を提供するようになりました。 ProcessHandleクラスは、プロセスの活性をチェックし、プロセスを破壊するメソッドも提供します。 onExitメソッドがあり、CompletableFutureクラスは、プロセスが終了したときにアクションを非同期に実行できます。

Tester.java

import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;

public class Tester {
   public static void main(String[] args) throws IOException {
      ProcessBuilder pb = new ProcessBuilder("notepad.exe");
      String np = "Not Present";
      Process p = pb.start();
      ProcessHandle.Info info = p.info();
      System.out.printf("Process ID : %s%n", p.pid());
      System.out.printf("Command name : %s%n", info.command().orElse(np));
      System.out.printf("Command line : %s%n", info.commandLine().orElse(np));

      System.out.printf("Start time: %s%n",
         info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())
         .toLocalDateTime().toString()).orElse(np));

      System.out.printf("Arguments : %s%n",
         info.arguments().map(a -> Stream.of(a).collect(
         Collectors.joining(" "))).orElse(np));

      System.out.printf("User : %s%n", info.user().orElse(np));
   }
}

出力

次の出力が表示されます。

Process ID : 5800
Command name : C:\Windows\System32\notepad.exe
Command line : Not Present
Start time: 2017-11-04T21:35:03.626
Arguments : Not Present
User: administrator

Java 9-ストリームAPIの改善

開発者が一連のオブジェクトから集計操作を実行できるように、Javaにストリームが導入されました。 Java 9では、ストリームを改善するために追加されるメソッドはほとんどありません。

takeWhile(述語インターフェイス)

構文

default Stream<T> takeWhile(Predicate<? super T> predicate)

takeWhileメソッドは、述語がfalseを返すまですべての値を取ります。 順序付けされたストリームの場合、指定された述語に一致するこのストリームから取得された要素の最長プレフィックスで構成されるストリームを返します。

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
         .forEach(System.out::print);
   }
}

出力

takeWhileメソッドは、a、b、cのすべての値を取り、stringが空になると、実行を停止しました。

abc

dropWhile(述語インターフェイス)

構文

default Stream<T> dropWhile(Predicate<? super T> predicate)

dropWhileメソッドは、述語がtrueを返すまで、開始時にすべての値を破棄します。 順序付けされたストリームの場合、指定された述語に一致する要素の最長の接頭辞を削除した後、このストリームの残りの要素で構成されるストリームを返します。

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
         .forEach(System.out::print);

      System.out.println();
      Stream.of("a","b","c","","e","","f").dropWhile(s-> !s.isEmpty())
         .forEach(System.out::print);
   }
}

出力

dropWhileメソッドは、a、b、およびcの値をドロップし、文字列が空になると、すべての値を取得します。

ef
ef

繰り返す

構文

static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

iterateメソッドには、hasNext述語がfalseを返すとループを停止するパラメーターとしてhasNext述語が含まれるようになりました。

import java.util.stream.IntStream;

public class Tester {
   public static void main(String[] args) {
      IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);
   }
}

出力

3
6
9

ofNullable

構文

static <T> Stream<T> ofNullable(T t)

ofNullableメソッドは、NullPointerExceptionsを防ぎ、ストリームのnullチェックを回避するために導入されました。 このメソッドは、nullでない場合は単一の要素を含むシーケンシャルStreamを返し、そうでない場合は空のStreamを返します。

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      long count = Stream.ofNullable(100).count();
      System.out.println(count);

      count = Stream.ofNullable(null).count();
      System.out.println(count);
   }
}

出力

1
0

Java 9-リソースの試用の改善

try-with-resourcesステートメントは、1つ以上のリソースが正式に宣言されたtryステートメントです。 ここで、リソースは、不要になったら閉じる必要があるオブジェクトです。 try-with-resourcesステートメントは、要件の終了後に各リソースが確実に閉じられるようにします。 java.lang.AutoCloseableまたはjava.io.Closeableインターフェースを実装するオブジェクトは、リソースとして使用できます。

Java 9より前では、リソースはtryの前またはtryステートメント内で宣言され、以下の例に示されています。 この例では、BufferedReaderをリソースとして使用して文字列を読み取り、BufferedReaderを閉じます。

Tester.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   }
   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (BufferedReader br1 = br) {
         return br1.readLine();
      }
   }
}

出力

test

ここでは、try statment内でリソースbr1を宣言してから使用する必要があります。 Java9では、br1を宣言する必要がなくなり、次のプログラムでも同じ結果が得られます。

Tester.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   }
   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (br) {
         return br.readLine();
      }
   }
}

出力

test

Java 9-@Deprecatedアノテーションの強化

@Deprecated注釈は、Java 5バージョンで導入されました。 @Deprecatedで注釈されたプログラム要素は、次の理由のいずれかのために使用すべきではないことを意味します-

  • その使用はエラーにつながる可能性があります。
  • 将来のバージョンでは互換性がない可能性があります。
  • 将来のバージョンでは削除される可能性があります。
  • より優れた効率的な代替手段がそれをスーパーシードしました。

非推奨の要素が使用されるたびに、コンパイラは警告を生成します。 Java 9では、@ Deprecatedアノテーションに2つの新しい機能強化が行われました。

  • forRemoval -注釈付きの要素が将来のバージョンで削除されるかどうかを示します。 デフォルト値はfalseです。
  • since -注釈付き要素が非推奨となったバージョンを返します。 デフォルト値は空の文字列です。

sinceで非推奨

Java 9のブールクラスjavadocの次の例は、@ Deprecatedアノテーションでのsince属性の使用を示しています。

[Class]

ブールクラスjavadoc

forRemovalで非推奨

Java 9のSystemクラスjavadocの次の例は、@ Deprecated注釈でのforRemoval属性の使用を示しています。

[Class]

システムクラスjavadoc

Java 9-内部クラスのダイヤモンド演算子

コードを読みやすくするために、Java 7でDiamond演算子が導入されましたが、匿名内部クラスでは使用できませんでした。 Java 9では、匿名クラスでも使用して、コードを簡素化し、読みやすさを向上させることができます。 Java 9より前の次のコードを検討してください。

Tester.java

public class Tester {
   public static void main(String[] args) {
      Handler<Integer> intHandler = new Handler<Integer>(1) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler.handle();
      Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler1.handle();
      Handler<?> handler = new Handler<Object>("test") {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      handler.handle();
   }
}
abstract class Handler<T> {
   public T content;

   public Handler(T content) {
      this.content = content;
   }

   abstract void handle();
}

出力

1
2
Test

Java 9では、以下に示すように、匿名クラスで<>演算子を使用できます。

Tester.java

public class Tester {
   public static void main(String[] args) {
      Handler<Integer> intHandler = new Handler<>(1) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler.handle();
      Handler<? extends Number> intHandler1 = new Handler<>(2) {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };
      intHandler1.handle();
      Handler<?> handler = new Handler<>("test") {
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      handler.handle();
   }
}

abstract class Handler<T> {
   public T content;

   public Handler(T content) {
      this.content = content;
   }

   abstract void handle();
}

出力

1
2
Test

Java 9-オプションのクラスの改善

nullチェックとNullPointerException問題を回避するために、Java 8でオプションのクラスが導入されました。 Java 9では、機能を改善するために3つの新しいメソッドが追加されました。

  • ストリーム()
  • ifPresentOrElse()
  • or()

stream()メソッド

構文

public Stream<T> stream()

値が存在する場合は、その値のみを含むシーケンシャルStreamを返します。それ以外の場合は、空のStreamを返します。

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Tester {
public static void main(String[] args) {
   List<Optional<String>> list = Arrays.asList (
      Optional.empty(),
      Optional.of("A"),
      Optional.empty(),
      Optional.of("B"));

     //filter the list based to print non-empty values

     //if optional is non-empty, get the value in stream, otherwise return empty
      List<String> filteredList = list.stream()
         .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
         .collect(Collectors.toList());

     //Optional::stream method will return a stream of either one
     //or zero element if data is present or not.
      List<String> filteredListJava9 = list.stream()
         .flatMap(Optional::stream)
         .collect(Collectors.toList());

      System.out.println(filteredList);
      System.out.println(filteredListJava9);
   }
}

出力

[A, B]
[A, B]

ifPresentOrElse()メソッド

構文

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

値が存在する場合、その値を使用して指定されたアクションを実行し、そうでない場合は、指定された空ベースのアクションを実行します。

import java.util.Optional;

public class Tester {
   public static void main(String[] args) {
      Optional<Integer> optional = Optional.of(1);

      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
         System.out.println("Not Present."));

      optional = Optional.empty();

      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
         System.out.println("Not Present."));
   }
}

出力

Value: 1
Not Present.

or()メソッド

構文

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

値が存在する場合は、値を説明するOptionalを返します。それ以外の場合は、提供機能によって生成されるOptionalを返します。

import java.util.Optional;
import java.util.function.Supplier;

public class Tester {
   public static void main(String[] args) {
      Optional<String> optional1 = Optional.of("Mahesh");

      Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");

      optional1 = optional1.or( supplierString);

      optional1.ifPresent( x -> System.out.println("Value: " + x));

      optional1 = Optional.empty();

      optional1 = optional1.or( supplierString);

      optional1.ifPresent( x -> System.out.println("Value: " + x));
   }
}

出力

Value: Mahesh
Value: Not Present

Java 9-多重解像度画像API

Java 9では、異なる解像度のバリエーションを持つ複数の画像をサポートする新しい多重解像度画像APIが導入されました。 このAPIを使用すると、異なる解像度の一連の画像を単一の多重解像度画像として使用できます。 以下は、多重解像度画像の主要な操作です。

  • * Image getResolutionVariant(double destImageWidth、double destImageHeight)*-指定されたサイズでこの論理イメージを表すのに最適なバリアントである特定のイメージを取得します。
  • * List <Image> getResolutionVariants()*-すべての解像度のバリエーションの読み取り可能なリストを取得します。

import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.awt.Image;
import java.awt.image.MultiResolutionImage;
import java.awt.image.BaseMultiResolutionImage;

import javax.imageio.ImageIO;

public class Tester {
   public static void main(String[] args) throws IOException, MalformedURLException {

      List<String> imgUrls = List.of("http://www.finddevguides.com/java9/images/logo.png",
         "http://www.finddevguides.com/java9/images/mini_logo.png",
         "http://www.finddevguides.com/java9/images/large_logo.png");

      List<Image> images = new ArrayList<Image>();

      for (String url : imgUrls) {
         images.add(ImageIO.read(new URL(url)));
      }

     //read all images into one multiresolution image
      MultiResolutionImage multiResolutionImage =
         new BaseMultiResolutionImage(images.toArray(new Image[0]));

     //get all variants of images
      List<Image> variants = multiResolutionImage.getResolutionVariants();

      System.out.println("Total number of images: " + variants.size());

      for (Image img : variants) {
         System.out.println(img);
      }

     //get a resolution-specific image variant for each indicated size
      Image variant1 = multiResolutionImage.getResolutionVariant(156, 45);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]",
         156, 45, variant1.getWidth(null), variant1.getHeight(null));

      Image variant2 = multiResolutionImage.getResolutionVariant(311, 89);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 311, 89,
         variant2.getWidth(null), variant2.getHeight(null));

      Image variant3 = multiResolutionImage.getResolutionVariant(622, 178);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 622, 178,
         variant3.getWidth(null), variant3.getHeight(null));

      Image variant4 = multiResolutionImage.getResolutionVariant(300, 300);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 300, 300,
         variant4.getWidth(null), variant4.getHeight(null));
   }
}

出力

Total number of images: 3
BufferedImage@7ce6a65d: type = 6 ColorModel: #pixelBits = 32 numComponents = 4
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =311
height = 89 #numDataElements 4 dataOff[0] = 3

BufferedImage@4c762604: type = 6 ColorModel: #pixelBits = 32 numComponents = 4
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =156
height = 45 #numDataElements 4 dataOff[0] = 3

BufferedImage@2641e737: type = 6 ColorModel: #pixelBits = 32 numComponents = 4
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =622
height = 178 #numDataElements 4 dataOff[0] = 3

Image for destination[156,45]: [311,89]
Image for destination[311,89]: [311,89]
Image for destination[622,178]: [622,178]
Image for destination[300,300]: [622,178]

CompletableFuture APIの改善

CompletableFutureクラスは、値とステータスを明示的に設定することで完了することができるFutureを表すためにJava 8で導入されました。 java.util.concurrent.CompletionStageとして使用できます。 将来の完了時にトリガーされた依存関数とアクションをサポートします。 Java 9では、CompletableFuture APIがさらに強化されました。 以下は、APIに行われた関連する変更です。

  • 遅延とタイムアウトのサポート。
  • サブクラス化のサポートの改善。
  • 新しいファクトリメソッドが追加されました。

遅延とタイムアウトのサポート

public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)

このメソッドは、指定されたタイムアウトの前に完了しない場合、指定された値でこのCompletableFutureを完了します。

public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)

このメソッドは、指定されたタイムアウトの前に完了しない場合、このCompletableFutureを例外的にTimeoutExceptionで完了します。

サブクラス化のサポートの改善

public Executor defaultExecutor()

Executorを指定しない非同期メソッドに使用されるデフォルトのExecutorを返します。 このメソッドは、サブクラスでオーバーライドされて、Executorを返し、少なくとも1つの独立したスレッドを提供します。

public <U> CompletableFuture<U> newIncompleteFuture()

CompletionStageメソッドによって返される型の新しい不完全なCompletableFutureを返します。 CompletableFutureクラスのサブクラスは、このメソッドをオーバーライドして、このCompletableFutureと同じクラスのインスタンスを返す必要があります。 デフォルトの実装は、CompletableFutureクラスのインスタンスを返します。

新しいファクトリーメソッド

public static <U> CompletableFuture<U> completedFuture(U value)

このファクトリメソッドは、指定された値で既に完了している新しいCompletableFutureを返します。

public static <U> CompletionStage<U> completedStage(U value)

このファクトリメソッドは、指定された値で既に完了している新しいCompletionStageを返し、CompletionStageインターフェイスに存在するメソッドのみをサポートします。

public static <U> CompletionStage<U> failedStage(Throwable ex)

このファクトリメソッドは、指定された例外で例外的に完了し、インターフェイスCompletionStageに存在するメソッドのみをサポートする新しいCompletionStageを返します。

Java 9-その他の機能

前述の機能とは別に、Java 9では、JDKプラットフォームに対してさらに多くの機能強化が行われています。 それらの一部を以下にリストします。

  • GC(ガベージコレクター)の改善
  • スタックウォーキングAPI
  • 着信シリアル化データのフィルター処理
  • アプレットAPIの廃止
  • 文字列連結を示す
  • 強化されたメソッドハンドル
  • JavaプラットフォームロギングAPIおよびサービス
  • コンパクトストリング
  • NashornのパーサーAPI

Java9-questions-answers