Java8-クイックガイド

JAVA 8は、JAVAプログラミング言語開発の主要な機能リリースです。その初期バージョンは2014年3月18日にリリースされました。Java8リリースでは、Javaは関数型プログラミング、新しいJavaScriptエンジン、日時操作用の新しいAPI、新しいストリーミングAPIなどのサポートを提供しました。

新機能

  • Lambda expression −Javaに機能処理機能を追加します。

  • Method references−関数を直接呼び出すのではなく、名前で関数を参照する。関数をパラメーターとして使用します。

  • Default method −デフォルトのメソッド実装を持つインターフェース。

  • New tools −依存関係を把握するために、「jdeps」のような新しいコンパイラツールとユーティリティが追加されました。

  • Stream API −パイプライン処理を容易にする新しいストリームAPI。

  • Date Time API −日時APIの改善。

  • Optional −null値を適切に処理するためのベストプラクティスに重点を置きます。

  • Nashorn, JavaScript Engine −JavaScriptコードを実行するためのJavaベースのエンジン。

次のコードスニペットについて考えてみます。

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;

public class Java8Tester {

   public static void main(String args[]) {
   
      List<String> names1 = new ArrayList<String>();
      names1.add("Mahesh ");
      names1.add("Suresh ");
      names1.add("Ramesh ");
      names1.add("Naresh ");
      names1.add("Kalpesh ");
		
      List<String> names2 = new ArrayList<String>();
      names2.add("Mahesh ");
      names2.add("Suresh ");
      names2.add("Ramesh ");
      names2.add("Naresh ");
      names2.add("Kalpesh ");
		
      Java8Tester tester = new Java8Tester();
      System.out.println("Sort using Java 7 syntax: ");
		
      tester.sortUsingJava7(names1);
      System.out.println(names1);
      System.out.println("Sort using Java 8 syntax: ");
		
      tester.sortUsingJava8(names2);
      System.out.println(names2);
   }
   
   //sort using java 7
   private void sortUsingJava7(List<String> names) {   
      Collections.sort(names, new Comparator<String>() {
         @Override
         public int compare(String s1, String s2) {
            return s1.compareTo(s2);
         }
      });
   }
   
   //sort using java 8
   private void sortUsingJava8(List<String> names) {
      Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
   }
}

プログラムを実行すると、次の結果が得られます。

Sort using Java 7 syntax:
[ Kalpesh Mahesh Naresh Ramesh Suresh ]
Sort using Java 8 syntax:
[ Kalpesh Mahesh Naresh Ramesh Suresh ]

ここに sortUsingJava8() メソッドは、ラムダ式をパラメーターとして使用するソート関数を使用して、ソート基準を取得します。

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

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

Java SEは、次のリンクから無料でダウンロードできます-

https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

オペレーティングシステムに基づいたバージョンをダウンロードします。

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

Windows 2000 / XPのパスの設定

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

  • 「マイコンピュータ」を右クリックし、「プロパティ」を選択します。

  • [詳細設定]タブの下にある[環境変数]ボタンをクリックします。

  • ここで、「Path」変数を変更して、Java実行可能ファイルへのパスも含まれるようにします。たとえば、パスが現在「C:\ WINDOWS \ SYSTEM32」に設定されている場合は、パスを「C:\ WINDOWS \ SYSTEM32; c:\ ProgramFiles \ 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があります。しかし今のところ、あなたは次のいずれかを考えることができます-

  • Notepad − Windowsマシンでは、メモ帳(このチュートリアルで推奨)やTextPadなどの単純なテキストエディターを使用できます。

  • Netbeans−オープンソースで無料のJavaIDEです。からダウンロードできますhttps://netbeans.org/index.html。

  • Eclipse −これはEclipseオープンソースコミュニティによって開発されたJava IDEでもあり、からダウンロードできます。 https://www.eclipse.org/。

ラムダ式はJava8で導入され、Java 8の最大の機能であると宣伝されています。ラムダ式は関数型プログラミングを容易にし、開発を大幅に簡素化します。

構文

ラムダ式は、次の構文によって特徴付けられます。

parameter -> expression body

ラムダ式の重要な特性は次のとおりです。

  • Optional type declaration−パラメータの型を宣言する必要はありません。コンパイラーは、パラメーターの値から同じことを推測できます。

  • Optional parenthesis around parameter−括弧内に単一のパラメータを宣言する必要はありません。複数のパラメーターの場合、括弧が必要です。

  • Optional curly braces −本体に単一のステートメントが含まれている場合、式本体で中括弧を使用する必要はありません。

  • Optional return keyword−本体に値を返す式が1つしかない場合、コンパイラは自動的に値を返します。式が値を返すことを示すには、中括弧が必要です。

ラムダ式の例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester tester = new Java8Tester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
		
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
		
      //without parenthesis
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
		
      //with parenthesis
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
		
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
	
   interface MathOperation {
      int operation(int a, int b);
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
	
   private int operate(int a, int b, MathOperation mathOperation) {
      return mathOperation.operation(a, b);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

上記の例で考慮すべき重要な点は次のとおりです。

  • ラムダ式は、主に関数型インターフェース、つまり単一のメソッドのみを持つインターフェースのインライン実装を定義するために使用されます。上記の例では、さまざまなタイプのラムダ式を使用して、MathOperationインターフェイスの操作メソッドを定義しました。次に、GreetingServiceのsayMessageの実装を定義しました。

  • Lambda式は、匿名クラスの必要性を排除し、Javaに非常にシンプルで強力な関数型プログラミング機能を提供します。

範囲

ラムダ式を使用すると、任意の最終変数または事実上最終変数(1回だけ割り当てられる)を参照できます。変数に2回目に値が割り当てられると、Lambda式はコンパイルエラーをスローします。

スコープの例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

public class Java8Tester {

   final static String salutation = "Hello! ";
   
   public static void main(String args[]) {
      GreetingService greetService1 = message -> 
      System.out.println(salutation + message);
      greetService1.sayMessage("Mahesh");
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Hello! Mahesh

メソッド参照は、名前でメソッドを指すのに役立ちます。メソッドリファレンスは、「::」記号を使用して記述されます。メソッドリファレンスは、次のタイプのメソッドを指すために使用できます-

  • 静的メソッド
  • インスタンスメソッド
  • new演算子を使用するコンストラクター(TreeSet :: new)

メソッド参照例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.util.List;
import java.util.ArrayList;

public class Java8Tester {

   public static void main(String args[]) {
      List names = new ArrayList();
		
      names.add("Mahesh");
      names.add("Suresh");
      names.add("Ramesh");
      names.add("Naresh");
      names.add("Kalpesh");
		
      names.forEach(System.out::println);
   }
}

ここでは、静的メソッド参照としてSystem.out :: printlnメソッドを渡しました。

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Mahesh
Suresh
Ramesh
Naresh
Kalpesh

機能インターフェイスには、表示する単一の機能があります。たとえば、単一のメソッド 'compareTo'を持つComparableインターフェイスが比較の目的で使用されます。Java 8は、ラムダ式で広く使用される多くの関数型インターフェースを定義しています。以下は、java.util.Functionパッケージで定義されている機能インターフェースのリストです。

シニア番号 インターフェースと説明
1

BiConsumer<T,U>

2つの入力引数を受け入れ、結果を返さない操作を表します。

2

BiFunction<T,U,R>

2つの引数を受け入れ、結果を生成する関数を表します。

3

BinaryOperator<T>

同じタイプの2つのオペランドに対する演算を表し、オペランドと同じタイプの結果を生成します。

4

BiPredicate<T,U>

2つの引数の述語(ブール値関数)を表します。

5

BooleanSupplier

ブール値の結果のサプライヤを表します。

6

Consumer<T>

単一の入力引数を受け入れ、結果を返さない操作を表します。

7

DoubleBinaryOperator

2つの二重値オペランドに対する演算を表し、二重値の結果を生成します。

8

DoubleConsumer

単一の二重値引数を受け入れ、結果を返さない演算を表します。

9

DoubleFunction<R>

二重値の引数を受け入れて結果を生成する関数を表します。

10

DoublePredicate

1つの二重値引数の述語(ブール値関数)を表します。

11

DoubleSupplier

二重値の結果のサプライヤを表します。

12

DoubleToIntFunction

二重値の引数を受け入れ、整数値の結果を生成する関数を表します。

13

DoubleToLongFunction

二重値の引数を受け入れ、長い値の結果を生成する関数を表します。

14

DoubleUnaryOperator

二重値の結果を生成する単一の二重値のオペランドに対する演算を表します。

15

Function<T,R>

1つの引数を受け入れ、結果を生成する関数を表します。

16

IntBinaryOperator

2つのint値のオペランドに対する演算を表し、int値の結果を生成します。

17

IntConsumer

単一のint値の引数を受け入れ、結果を返さない演算を表します。

18

IntFunction<R>

int値の引数を受け入れ、結果を生成する関数を表します。

19

IntPredicate

1つの整数値引数の述語(ブール値関数)を表します。

20

IntSupplier

整数値の結果のサプライヤを表します。

21

IntToDoubleFunction

int値の引数を受け入れ、double値の結果を生成する関数を表します。

22

IntToLongFunction

int値の引数を受け入れ、long値の結果を生成する関数を表します。

23

IntUnaryOperator

int値の結果を生成する単一のint値のオペランドに対する演算を表します。

24

LongBinaryOperator

2つの長い値のオペランドに対する演算を表し、長い値の結果を生成します。

25

LongConsumer

単一の長い値の引数を受け入れ、結果を返さない操作を表します。

26

LongFunction<R>

長い値の引数を受け入れて結果を生成する関数を表します。

27

LongPredicate

1つの長い値の引数の述語(ブール値関数)を表します。

28

LongSupplier

価値の高い結果のサプライヤーを表します。

29

LongToDoubleFunction

長い値の引数を受け入れ、二重値の結果を生成する関数を表します。

30

LongToIntFunction

長い値の引数を受け入れ、int値の結果を生成する関数を表します。

31

LongUnaryOperator

長い値の結果を生成する単一の長い値のオペランドに対する演算を表します。

32

ObjDoubleConsumer<T>

オブジェクト値と二重値の引数を受け入れ、結果を返さない操作を表します。

33

ObjIntConsumer<T>

オブジェクト値と整数値の引数を受け入れ、結果を返さない操作を表します。

34

ObjLongConsumer<T>

オブジェクト値とロング値の引数を受け入れ、結果を返さない操作を表します。

35

Predicate<T>

1つの引数の述語(ブール値関数)を表します。

36

Supplier<T>

結果のサプライヤを表します。

37

ToDoubleBiFunction<T,U>

2つの引数を受け入れ、二重値の結果を生成する関数を表します。

38

ToDoubleFunction<T>

二重値の結果を生成する関数を表します。

39

ToIntBiFunction<T,U>

2つの引数を受け入れ、int値の結果を生成する関数を表します。

40

ToIntFunction<T>

int値の結果を生成する関数を表します。

41

ToLongBiFunction<T,U>

2つの引数を受け入れ、長い値の結果を生成する関数を表します。

42

ToLongFunction<T>

長い値の結果を生成する関数を表します。

43

UnaryOperator<T>

オペランドと同じタイプの結果を生成する単一のオペランドに対する演算を表します。

関数型インターフェースの例

述語<T>インターフェースは、ブール値を返すメソッドtest(Object)を持つ関数型インターフェースです。このインターフェースは、オブジェクトが真または偽であるかどうかがテストされることを示します。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Java8Tester {

   public static void main(String args[]) {
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
		
      // Predicate<Integer> predicate = n -> true
      // n is passed as parameter to test method of Predicate interface
      // test method will always return true no matter what value n has.
		
      System.out.println("Print all numbers:");
		
      //pass n as parameter
      eval(list, n->true);
		
      // Predicate<Integer> predicate1 = n -> n%2 == 0
      // n is passed as parameter to test method of Predicate interface
      // test method will return true if n%2 comes to be zero
		
      System.out.println("Print even numbers:");
      eval(list, n-> n%2 == 0 );
		
      // Predicate<Integer> predicate2 = n -> n > 3
      // n is passed as parameter to test method of Predicate interface
      // test method will return true if n is greater than 3.
		
      System.out.println("Print numbers greater than 3:");
      eval(list, n-> n > 3 );
   }
	
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {

      for(Integer n: list) {

         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}

ここでは、単一の入力を受け取り、ブール値を返すPredicateインターフェースを渡しました。

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Print all numbers:
1
2
3
4
5
6
7
8
9
Print even numbers:
2
4
6
8
Print numbers greater than 3:
4
5
6
7
8
9

Java 8では、インターフェイスにデフォルトのメソッド実装の新しい概念が導入されています。この機能は下位互換性のために追加されているため、古いインターフェースを使用してJava8のラムダ式機能を活用できます。

たとえば、「List」または「Collection」インターフェースには「forEach」メソッド宣言がありません。したがって、そのようなメソッドを追加すると、コレクションフレームワークの実装が壊れてしまいます。Java 8ではデフォルトのメソッドが導入されているため、List / CollectionインターフェースはforEachメソッドのデフォルトの実装を持つことができ、これらのインターフェースを実装するクラスは同じものを実装する必要はありません。

構文

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

複数のデフォルト

インターフェイスにデフォルト関数がある場合、クラスが同じデフォルトメソッドで2つのインターフェイスを実装している可能性があります。次のコードは、このあいまいさを解決する方法を説明しています。

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

public interface fourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

最初の解決策は、デフォルトの実装をオーバーライドする独自のメソッドを作成することです。

public class car implements vehicle, fourWheeler {

   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

2番目の解決策は、superを使用して指定されたインターフェイスのデフォルトメソッドを呼び出すことです。

public class car implements vehicle, fourWheeler {

   public void print() {
      vehicle.super.print();
   }
}

静的デフォルトメソッド

インターフェイスには、Java8以降の静的ヘルパーメソッドを含めることもできます。

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

デフォルトのメソッド例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Vehicle vehicle = new Car();
      vehicle.print();
   }
}

interface Vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

interface FourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {

   public void print() {
      Vehicle.super.print();
      FourWheeler.super.print();
      Vehicle.blowHorn();
      System.out.println("I am a car!");
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!

Streamは、Java 8で導入された新しい抽象層です。streamを使用すると、SQLステートメントと同様の宣言的な方法でデータを処理できます。たとえば、次のSQLステートメントについて考えてみます。

SELECT max(salary), employee_id, employee_name FROM Employee

上記のSQL式は、開発者側で計算を行うことなく、給与が最大の従業員の詳細を自動的に返します。開発者は、Javaのコレクションフレームワークを使用して、ループを使用し、繰り返しチェックを行う必要があります。もう1つの懸念は効率です。マルチコアプロセッサは簡単に利用できるため、Java開発者は、エラーが発生しやすい並列コード処理を作成する必要があります。

このような問題を解決するために、Java 8では、開発者がデータを宣言的に処理し、特定のコードを記述せずにマルチコアアーキテクチャを活用できるようにするストリームの概念が導入されました。

ストリームとは何ですか?

ストリームは、集約操作をサポートするソースからのオブジェクトのシーケンスを表します。ストリームの特徴は次のとおりです-

  • Sequence of elements−ストリームは、特定のタイプの要素のセットを順番に提供します。ストリームは、オンデマンドで要素を取得/計算します。要素を保存することはありません。

  • Source − Streamは、コレクション、配列、またはI / Oリソースを入力ソースとして受け取ります。

  • Aggregate operations − Streamは、filter、map、limit、reduce、find、matchなどの集約操作をサポートします。

  • Pipelining−ほとんどのストリーム操作は、結果をパイプライン化できるようにストリーム自体を返します。これらの操作は中間操作と呼ばれ、その機能は入力を受け取り、処理して、出力をターゲットに返すことです。collect()メソッドは、ストリームの終了をマークするためにパイプライン操作の最後に通常存在するターミナル操作です。

  • Automatic iterations −明示的な反復が必要なコレクションとは対照的に、ストリーム操作は、提供されたソース要素に対して内部的に反復を実行します。

ストリームの生成

Java 8では、コレクションインターフェイスにはストリームを生成するための2つのメソッドがあります。

  • stream() −コレクションをソースと見なしてシーケンシャルストリームを返します。

  • parallelStream() −コレクションをソースと見なして並列ストリームを返します。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

forEach

Streamは、ストリームの各要素を反復処理するための新しいメソッド 'forEach'を提供しました。次のコードセグメントは、forEachを使用して10個の乱数を出力する方法を示しています。

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

地図

'map'メソッドは、各要素を対応する結果にマップするために使用されます。次のコードセグメントは、マップを使用して数値の一意の平方を出力します。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

//get list of unique squares
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

フィルタ

'filter'メソッドは、基準に基づいて要素を削除するために使用されます。次のコードセグメントは、フィルターを使用して空の文字列の数を出力します。

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();

制限

'limit'メソッドは、ストリームのサイズを縮小するために使用されます。次のコードセグメントは、limitを使用して10個の乱数を出力する方法を示しています。

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

ソート済み

'sorted'メソッドは、ストリームをソートするために使用されます。次のコードセグメントは、10個の乱数をソートされた順序で印刷する方法を示しています。

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

並列処理

parallelStreamは、並列処理用のストリームの代替手段です。parallelStreamを使用して空の文字列の数を出力する次のコードセグメントを見てください。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

シーケンシャルストリームとパラレルストリームを切り替えるのは非常に簡単です。

コレクター

コレクターは、ストリームの要素に対する処理の結果を組み合わせるために使用されます。コレクターを使用して、リストまたは文字列を返すことができます。

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("Filtered List: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Merged String: " + mergedString);

統計

Java 8では、ストリーム処理が行われているときにすべての統計を計算するための統計コレクターが導入されています。

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("Highest number in List : " + stats.getMax());
System.out.println("Lowest number in List : " + stats.getMin());
System.out.println("Sum of all numbers : " + stats.getSum());
System.out.println("Average of all numbers : " + stats.getAverage());

ストリームの例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;

public class Java8Tester {

   public static void main(String args[]) {
      System.out.println("Using Java 7: ");
		
      // Count empty strings
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      System.out.println("List: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
		
      System.out.println("Empty Strings: " + count);
      count = getCountLength3UsingJava7(strings);
		
      System.out.println("Strings of length 3: " + count);
		
      //Eliminate empty string
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("Filtered List: " + filtered);
		
      //Eliminate empty string and join using comma.
      String mergedString = getMergedStringUsingJava7(strings,", ");
      System.out.println("Merged String: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
		
      //get list of square of distinct numbers
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("Squares List: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
		
      System.out.println("List: " +integers);
      System.out.println("Highest number in List : " + getMax(integers));
      System.out.println("Lowest number in List : " + getMin(integers));
      System.out.println("Sum of all numbers : " + getSum(integers));
      System.out.println("Average of all numbers : " + getAverage(integers));
      System.out.println("Random Numbers: ");
		
      //print ten random numbers
      Random random = new Random();
		
      for(int i = 0; i < 10; i++) {
         System.out.println(random.nextInt());
      }
		
      System.out.println("Using Java 8: ");
      System.out.println("List: " +strings);
		
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("Empty Strings: " + count);
		
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("Strings of length 3: " + count);
		
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("Filtered List: " + filtered);
		
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("Merged String: " + mergedString);
		
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("List: " +integers);
		
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
		
      System.out.println("Highest number in List : " + stats.getMax());
      System.out.println("Lowest number in List : " + stats.getMin());
      System.out.println("Sum of all numbers : " + stats.getSum());
      System.out.println("Average of all numbers : " + stats.getAverage());
      System.out.println("Random Numbers: ");
		
      random.ints().limit(10).sorted().forEach(System.out::println);
		
      //parallel processing
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("Empty Strings: " + count);
   }
	
   private static int getCountEmptyStringUsingJava7(List<String> strings) {
      int count = 0;

      for(String string: strings) {
		
         if(string.isEmpty()) {
            count++;
         }
      }
      return count;
   }
	
   private static int getCountLength3UsingJava7(List<String> strings) {
      int count = 0;
		
      for(String string: strings) {
		
         if(string.length() == 3) {
            count++;
         }
      }
      return count;
   }
	
   private static List<String> deleteEmptyStringsUsingJava7(List<String> strings) {
      List<String> filteredList = new ArrayList<String>();
		
      for(String string: strings) {
		
         if(!string.isEmpty()) {
             filteredList.add(string);
         }
      }
      return filteredList;
   }
	
   private static String getMergedStringUsingJava7(List<String> strings, String separator) {
      StringBuilder stringBuilder = new StringBuilder();
		
      for(String string: strings) {
		
         if(!string.isEmpty()) {
            stringBuilder.append(string);
            stringBuilder.append(separator);
         }
      }
      String mergedString = stringBuilder.toString();
      return mergedString.substring(0, mergedString.length()-2);
   }
	
   private static List<Integer> getSquares(List<Integer> numbers) {
      List<Integer> squaresList = new ArrayList<Integer>();
		
      for(Integer number: numbers) {
         Integer square = new Integer(number.intValue() * number.intValue());
			
         if(!squaresList.contains(square)) {
            squaresList.add(square);
         }
      }
      return squaresList;
   }
	
   private static int getMax(List<Integer> numbers) {
      int max = numbers.get(0);
		
      for(int i = 1;i < numbers.size();i++) {
		
         Integer number = numbers.get(i);
			
         if(number.intValue() > max) {
            max = number.intValue();
         }
      }
      return max;
   }
	
   private static int getMin(List<Integer> numbers) {
      int min = numbers.get(0);
		
      for(int i= 1;i < numbers.size();i++) {
         Integer number = numbers.get(i);
		
         if(number.intValue() < min) {
            min = number.intValue();
         }
      }
      return min;
   }
	
   private static int getSum(List numbers) {
      int sum = (int)(numbers.get(0));
		
      for(int i = 1;i < numbers.size();i++) {
         sum += (int)numbers.get(i);
      }
      return sum;
   }
	
   private static int getAverage(List<Integer> numbers) {
      return getSum(numbers) / numbers.size();
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の結果が得られるはずです-

Using Java 7:
List: [abc, , bc, efg, abcd, , jkl]
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
List: [1, 2, 13, 4, 15, 6, 17, 8, 19]
Highest number in List : 19
Lowest number in List : 1
Sum of all numbers : 85
Average of all numbers : 9
Random Numbers:
-1279735475
903418352
-1133928044
-1571118911
628530462
18407523
-881538250
-718932165
270259229
421676854
Using Java 8:
List: [abc, , bc, efg, abcd, , jkl]
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
List: [1, 2, 13, 4, 15, 6, 17, 8, 19]
Highest number in List : 19
Lowest number in List : 1
Sum of all numbers : 85
Average of all numbers : 9.444444444444445
Random Numbers:
-1009474951
-551240647
-2484714
181614550
933444268
1227850416
1579250773
1627454872
1683033687
1798939493
Empty Strings: 2

オプションは、null以外のオブジェクトを格納するために使用されるコンテナオブジェクトです。オプションのオブジェクトは、値がないnullを表すために使用されます。このクラスには、null値をチェックする代わりに、値を「使用可能」または「使用不可」として処理するコードを容易にするさまざまなユーティリティメソッドがあります。これはJava8で導入され、GuavaのOptionalと同様です。

クラス宣言

以下はの宣言です java.util.Optional<T> クラス-

public final class Optional<T> extends Object

クラスメソッド

シニア番号 方法と説明
1

static <T> Optional<T> empty()

空のオプションインスタンスを返します。

2

boolean equals(Object obj)

他のオブジェクトがこのオプションと「等しい」かどうかを示します。

3

Optional<T> filter(Predicate<? super <T> predicate)

値が存在し、その値が指定された述語と一致する場合は、値を説明するオプションを返します。それ以外の場合は、空のオプションを返します。

4

<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

値が存在する場合は、提供されたオプションのベアリングマッピング関数を適用し、その結果を返します。それ以外の場合は、空のオプションを返します。

5

T get()

このオプションに値が存在する場合は、値を返します。存在しない場合は、NoSuchElementExceptionをスローします。

6

int hashCode()

現在の値がある場合はそのハッシュコード値を返し、値がない場合は0(ゼロ)を返します。

7

void ifPresent(Consumer<? super T> consumer)

値が存在する場合は、その値を使用して指定されたコンシューマーを呼び出します。存在しない場合は、何も実行しません。

8

boolean isPresent()

値が存在する場合はtrueを返し、存在しない場合はfalseを返します。

9

<U>Optional<U> map(Function<? super T,? extends U> mapper)

値が存在する場合は、提供されたマッピング関数をその値に適用し、結果がnullでない場合は、結果を説明するオプションを返します。

10

static <T> Optional<T> of(T value)

指定された現在のnull以外の値を持つオプションを返します。

11

static <T> Optional<T> ofNullable(T value)

null以外の場合は、指定された値を説明するオプションを返します。それ以外の場合は、空のオプションを返します。

12

T orElse(T other)

存在する場合は値を返し、存在しない場合はその他を返します。

13

T orElseGet(Supplier<? extends T> other)

存在する場合は値を返し、存在しない場合はotherを呼び出し、その呼び出しの結果を返します。

14

<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

含まれている値が存在する場合はそれを返します。存在しない場合は、提供されたサプライヤによって作成される例外をスローします。

15

String toString()

デバッグに適したこのオプションの空でない文字列表現を返します。

このクラスは、次のクラスからメソッドを継承します-

  • java.lang.Object

オプションの例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.util.Optional;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8Tester = new Java8Tester();
      Integer value1 = null;
      Integer value2 = new Integer(10);
		
      //Optional.ofNullable - allows passed parameter to be null.
      Optional<Integer> a = Optional.ofNullable(value1);
		
      //Optional.of - throws NullPointerException if passed parameter is null
      Optional<Integer> b = Optional.of(value2);
      System.out.println(java8Tester.sum(a,b));
   }
	
   public Integer sum(Optional<Integer> a, Optional<Integer> b) {
      //Optional.isPresent - checks the value is present or not
		
      System.out.println("First parameter is present: " + a.isPresent());
      System.out.println("Second parameter is present: " + b.isPresent());
		
      //Optional.orElse - returns the value if present otherwise returns
      //the default value passed.
      Integer value1 = a.orElse(new Integer(0));
		
      //Optional.get - gets the value, value should be present
      Integer value2 = b.get();
      return value1 + value2;
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

First parameter is present: false
Second parameter is present: true
10

Java 8では、既存のRhinoを置き換えるために、大幅に改善されたjavascriptエンジンであるNashornが導入されています。Nashornは、メモリ内のコードを直接コンパイルし、バイトコードをJVMに渡すため、2〜10倍のパフォーマンスを提供します。Nashornは、パフォーマンスを向上させるためにJava7で導入されたinvokedynamics機能を使用します。

jjs

Nashornエンジンの場合、JAVA8は新しいコマンドラインツールを導入します。 jjs, コンソールでJavaScriptコードを実行します。

jsファイルの解釈

ファイルを作成して保存します sample.js c:\> JAVAフォルダー内。

sample.js

print('Hello World!');

コンソールを開き、次のコマンドを使用します。

C:\JAVA>jjs sample.js

次の出力が生成されます。

Hello World!

インタラクティブモードのjjs

コンソールを開き、次のコマンドを使用します。

C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>

引数を渡す

コンソールを開き、次のコマンドを使用します。

C:\JAVA> jjs -- a b c
jjs> print('letters: ' +arguments.join(", "))
letters: a, b, c
jjs>

JavaからJavaScriptを呼び出す

ScriptEngineManagerを使用すると、JavaScriptコードをJavaで呼び出して解釈できます。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class Java8Tester {

   public static void main(String args[]) {
      ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
      ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
		
      String name = "Mahesh";
      Integer result = null;
      
      try {
         nashorn.eval("print('" + name + "')");
         result = (Integer) nashorn.eval("10 + 2");
         
      } catch(ScriptException e) {
         System.out.println("Error executing script: "+ e.getMessage());
      }
      System.out.println(result.toString());
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の結果が得られるはずです-

Mahesh
12

JavaScriptからJavaを呼び出す

次の例では、JavaスクリプトでJavaクラスをインポートして使用する方法について説明します。

作成して保存 sample.js c:\> JAVAフォルダー内。

sample.js

var BigDecimal = Java.type('java.math.BigDecimal');

function calculate(amount, percentage) {

   var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(
      new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
   
   return result.toPlainString();
}
var result = calculate(568000000000000000023,13.9);
print(result);

コンソールを開き、次のコマンドを使用します。

C:\JAVA>jjs sample.js

次の出力が生成されます-

78952000000000000003.20

Java 8では、古い日時APIの次の欠点をカバーするために、新しい日時APIが導入されています。

  • Not thread safe− java.util.Dateはスレッドセーフではないため、開発者は日付を使用する際に並行性の問題に対処する必要があります。新しい日時APIは不変であり、セッターメソッドはありません。

  • Poor design−デフォルトの日付は1900から始まり、月は1から始まり、日は0から始まるため、統一性はありません。古いAPIには、日付操作のための直接的なメソッドがありませんでした。新しいAPIは、そのような操作のための多数のユーティリティメソッドを提供します。

  • Difficult time zone handling−開発者は、タイムゾーンの問題に対処するために多くのコードを作成する必要がありました。新しいAPIは、ドメイン固有の設計を念頭に置いて開発されました。

Java 8では、java.timeパッケージの下に新しい日時APIが導入されています。以下は、java.timeパッケージで導入された重要なクラスの一部です。

  • Local −タイムゾーン処理の複雑さのない簡素化された日時API。

  • Zoned −さまざまなタイムゾーンを処理するための特殊な日時API。

ローカル日時API

LocalDate / LocalTimeクラスとLocalDateTimeクラスは、タイムゾーンが不要な開発を簡素化します。それらの動作を見てみましょう。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Month;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testLocalDateTime();
   }
	
   public void testLocalDateTime() {
      // Get the current date and time
      LocalDateTime currentTime = LocalDateTime.now();
      System.out.println("Current DateTime: " + currentTime);
		
      LocalDate date1 = currentTime.toLocalDate();
      System.out.println("date1: " + date1);
		
      Month month = currentTime.getMonth();
      int day = currentTime.getDayOfMonth();
      int seconds = currentTime.getSecond();
		
      System.out.println("Month: " + month +"day: " + day +"seconds: " + seconds);
		
      LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
      System.out.println("date2: " + date2);
		
      //12 december 2014
      LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
      System.out.println("date3: " + date3);
		
      //22 hour 15 minutes
      LocalTime date4 = LocalTime.of(22, 15);
      System.out.println("date4: " + date4);
		
      //parse a string
      LocalTime date5 = LocalTime.parse("20:15:30");
      System.out.println("date5: " + date5);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Current DateTime: 2014-12-09T11:00:45.457
date1: 2014-12-09
Month: DECEMBERday: 9seconds: 45
date2: 2012-12-10T11:00:45.457
date3: 2014-12-12
date4: 22:15
date5: 20:15:30

ゾーン化された日時API

ゾーン化された日時APIは、タイムゾーンを検討するときに使用されます。それらの動作を見てみましょう。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testZonedDateTime();
   }
	
   public void testZonedDateTime() {
      // Get the current date and time
      ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
      System.out.println("date1: " + date1);
		
      ZoneId id = ZoneId.of("Europe/Paris");
      System.out.println("ZoneId: " + id);
		
      ZoneId currentZone = ZoneId.systemDefault();
      System.out.println("CurrentZone: " + currentZone);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
ZoneId: Europe/Paris
CurrentZone: Etc/UTC

クロノ単位列挙型

java.time.temporal.ChronoUnit列挙型がJava8に追加され、日や月などを表すために古いAPIで使用されていた整数値が置き換えられました。実際の動作を見てみましょう。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testChromoUnits();
   }
	
   public void testChromoUnits() {
      //Get the current date
      LocalDate today = LocalDate.now();
      System.out.println("Current date: " + today);
		
      //add 1 week to the current date
      LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
      System.out.println("Next week: " + nextWeek);
		
      //add 1 month to the current date
      LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
      System.out.println("Next month: " + nextMonth);
		
      //add 1 year to the current date
      LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
      System.out.println("Next year: " + nextYear);
		
      //add 10 years to the current date
      LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);
      System.out.println("Date after ten year: " + nextDecade);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の結果が得られるはずです-

Current date: 2014-12-10
Next week: 2014-12-17
Next month: 2015-01-10
Next year: 2015-12-10
Date after ten year: 2024-12-10

期間と期間

Java 8では、時差を処理す​​るために2つの特殊なクラスが導入されています。

  • Period −日付ベースの時間を扱います。

  • Duration −時間ベースの時間を扱います。

それらの動作を見てみましょう。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.time.temporal.ChronoUnit;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Duration;
import java.time.Period;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testPeriod();
      java8tester.testDuration();
   }
	
   public void testPeriod() {
      //Get the current date
      LocalDate date1 = LocalDate.now();
      System.out.println("Current date: " + date1);
		
      //add 1 month to the current date
      LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS);
      System.out.println("Next month: " + date2);
      
      Period period = Period.between(date2, date1);
      System.out.println("Period: " + period);
   }
	
   public void testDuration() {
      LocalTime time1 = LocalTime.now();
      Duration twoHours = Duration.ofHours(2);
		
      LocalTime time2 = time1.plus(twoHours);
      Duration duration = Duration.between(time1, time2);
		
      System.out.println("Duration: " + duration);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Current date: 2014-12-10
Next month: 2015-01-10
Period: P-1M
Duration: PT2H

テンポラルアジャスター

TemporalAdjusterは、日付の計算を実行するために使用されます。たとえば、「今月の第2土曜日」または「次の火曜日」を取得します。それらの動作を見てみましょう。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.time.DayOfWeek;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testAdjusters();
   }
	
   public void testAdjusters() {
      //Get the current date
      LocalDate date1 = LocalDate.now();
      System.out.println("Current date: " + date1);
		
      //get the next tuesday
      LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
      System.out.println("Next Tuesday on : " + nextTuesday);
		
      //get the second saturday of next month
      LocalDate firstInYear = LocalDate.of(date1.getYear(),date1.getMonth(), 1);
      LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame(
         DayOfWeek.SATURDAY)).with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
      System.out.println("Second Saturday on : " + secondSaturday);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の結果が得られるはずです-

Current date: 2014-12-10
Next Tuesday on : 2014-12-16
Second Saturday on : 2014-12-13

下位互換性

toInstant()メソッドが元のDateオブジェクトとCalendarオブジェクトに追加され、これらを使用して新しいDate-TimeAPIに変換できます。ofInstant(Insant、ZoneId)メソッドを使用して、LocalDateTimeまたはZonedDateTimeオブジェクトを取得します。それらの動作を見てみましょう。

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.time.LocalDateTime;
import java.time.ZonedDateTime;

import java.util.Date;

import java.time.Instant;
import java.time.ZoneId;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testBackwardCompatability();
   }
	
   public void testBackwardCompatability() {
      //Get the current date
      Date currentDate = new Date();
      System.out.println("Current date: " + currentDate);
		
      //Get the instant of current date in terms of milliseconds
      Instant now = currentDate.toInstant();
      ZoneId currentZone = ZoneId.systemDefault();
		
      LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone);
      System.out.println("Local date: " + localDateTime);
		
      ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone);
      System.out.println("Zoned date: " + zonedDateTime);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Current date: Wed Dec 10 05:44:06 UTC 2014
Local date: 2014-12-10T05:44:06.635
Zoned date: 2014-12-10T05:44:06.635Z[Etc/UTC]

Java 8で、Base64はついに期限を迎えました。Java 8には、Base64エンコーディング用のエンコーダーとデコーダーが組み込まれています。Java 8では、3種類のBase64エンコーディングを使用できます。

  • Simple−出力はA-Za-z0-9 + /にある文字のセットにマップされます。エンコーダーは出力に改行を追加せず、デコーダーはA-Za-z0-9 + /以外の文字を拒否します。

  • URL−出力はA-Za-z0-9 + _にある文字のセットにマップされます。出力はURLとファイル名で安全です。

  • MIME−出力はMIMEフレンドリ形式にマップされます。出力は、それぞれ76文字以内の行で表され、改行 '\ r'とそれに続く改行 '\ n'を行区切り文字として使用します。エンコードされた出力の最後に行区切り文字はありません。

ネストされたクラス

シニア番号 ネストされたクラスと説明
1

static class Base64.Decoder

このクラスは、RFC4648およびRFC2045で指定されているBase64エンコード方式を使用してバイトデータをデコードするためのデコーダーを実装します。

2

static class Base64.Encoder

このクラスは、RFC4648およびRFC2045で指定されているBase64エンコード方式を使用してバイトデータをエンコードするためのエンコーダーを実装します。

メソッド

シニア番号 メソッド名と説明
1

static Base64.Decoder getDecoder()

Basicタイプのbase64エンコーディングスキームを使用してデコードするBase64.Decoderを返します。

2

static Base64.Encoder getEncoder()

Basicタイプのbase64エンコードスキームを使用してエンコードするBase64.Encoderを返します。

3

static Base64.Decoder getMimeDecoder()

MIMEタイプbase64デコードスキームを使用してデコードするBase64.Decoderを返します。

4

static Base64.Encoder getMimeEncoder()

MIMEタイプbase64エンコードスキームを使用してエンコードするBase64.Encoderを返します。

5

static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)

指定された行の長さと行区切り記号を使用して、MIMEタイプのbase64エンコードスキームを使用してエンコードするBase64.Encoderを返します。

6

static Base64.Decoder getUrlDecoder()

URLとファイル名のセーフタイプbase64エンコードスキームを使用してデコードするBase64.Decoderを返します。

7

static Base64.Encoder getUrlEncoder()

URLとファイル名のセーフタイプbase64エンコードスキームを使用してエンコードするBase64.Encoderを返します。

継承されたメソッド

このクラスは、次のクラスからメソッドを継承します-

  • java.lang.Object

Base64の例

たとえばC:/> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;

public class HelloWorld {

   public static void main(String args[]) {

      try {
		
         // Encode using basic encoder
         String base64encodedString = Base64.getEncoder().encodeToString(
            "TutorialsPoint?java8".getBytes("utf-8"));
         System.out.println("Base64 Encoded String (Basic) :" + base64encodedString);
		
         // Decode
         byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
		
         System.out.println("Original String: " + new String(base64decodedBytes, "utf-8"));
         base64encodedString = Base64.getUrlEncoder().encodeToString(
            "TutorialsPoint?java8".getBytes("utf-8"));
         System.out.println("Base64 Encoded String (URL) :" + base64encodedString);
		
         StringBuilder stringBuilder = new StringBuilder();
		
         for (int i = 0; i < 10; ++i) {
            stringBuilder.append(UUID.randomUUID().toString());
         }
		
         byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
         String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
         System.out.println("Base64 Encoded String (MIME) :" + mimeEncodedString);

      } catch(UnsupportedEncodingException e) {
         System.out.println("Error :" + e.getMessage());
      }
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Base64 Encoded String (Basic) :VHV0b3JpYWxzUG9pbnQ/amF2YTg=
Original String: TutorialsPoint?java8
Base64 Encoded String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg=
Base64 Encoded String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJl
NTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQz
NDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1
MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2
Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5
YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFk
LWJiM2UtM2JhYzUxYzI5OWI4