Java8-quick-guide
Java 8-概要
JAVA 8は、JAVAプログラミング言語開発の主要な機能リリースです。 初期バージョンは2014年3月18日にリリースされました。 Java 8リリースでは、Javaは関数型プログラミング、新しいJavaScriptエンジン、日時操作用の新しいAPI、新しいストリーミングAPIなどのサポートを提供しました。
新機能
- ラムダ式-Javaに機能処理機能を追加します。
- メソッド参照-関数を直接呼び出すのではなく、名前で関数を参照します。 パラメータとして関数を使用します。
- デフォルトメソッド-デフォルトのメソッド実装を持つインターフェース。
- 新しいツール-依存関係を把握するために、「jdeps」のような新しいコンパイラツールとユーティリティが追加されました。
- Stream API -パイプライン処理を容易にする新しいストリームAPI。
- *日付時刻API *-日付時刻APIの改善。
- オプション-null値を適切に処理するためのベストプラクティスに重点を置きます。
- * Nashorn、JavaScriptエンジン*-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 8-環境設定
ローカル環境のセットアップ
Javaプログラミング言語用に独自の環境をセットアップする場合は、このセクションでプロセス全体をガイドします。 Java環境をセットアップするには、以下の手順に従ってください。
Java SEは、次のリンクから無料でダウンロードできます-
https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363l
オペレーティングシステムに基づいてバージョンをダウンロードします。
指示に従ってJavaをダウンロードし、*。exe *を実行してJavaをマシンにインストールします。 マシンにJavaをインストールしたら、正しいインストールディレクトリを指すように環境変数を設定する必要があります。
Windows 2000/XPのパスのセットアップ
Javaをc:\ Program Files \ java \ jdkディレクトリにインストールしたと仮定します-
- 「マイコンピュータ」を右クリックして、「プロパティ」を選択します。
- 「詳細」タブの下の「環境変数」ボタンをクリックします。
- ここで、「Path」変数を変更して、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があります。 しかし、今のところ、次のいずれかを検討することができます-
- メモ帳-Windowsマシンでは、メモ帳(このチュートリアルに推奨)やTextPadなどのシンプルなテキストエディタを使用できます。
- Netbeans -オープンソースで無料のJava IDEです。 [[1]]
- Eclipse -Eclipseオープンソースコミュニティによって開発されたJava IDEでもあり、https://www.eclipse.org/からダウンロードできます。
Java 8-ラムダ式
ラムダ式はJava 8で導入され、Java 8の最大の機能であると宣伝されています。 ラムダ式は関数型プログラミングを容易にし、開発を大幅に簡素化します。
構文
ラムダ式は、次の構文によって特徴付けられます。
parameter -> expression body
以下は、ラムダ式の重要な特徴です。
- オプションの型宣言-パラメータの型を宣言する必要はありません。 コンパイラーは、パラメーターの値から同じことを推測できます。
- パラメータを囲むオプションの括弧-括弧で単一のパラメータを宣言する必要はありません。 複数のパラメーターの場合、括弧が必要です。
- オプションの中括弧-本体に単一のステートメントが含まれる場合、式の本体で中括弧を使用する必要はありません。
- オプションのreturnキーワード-値を返す単一の式が本体にある場合、コンパイラは自動的に値を返します。 式が値を返すことを示すには、中括弧が必要です。
ラムダ式の例
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の実装を定義しました。
- ラムダ式は、匿名クラスの必要性を排除し、Javaに非常にシンプルでありながら強力な関数型プログラミング機能を提供します。
範囲
ラムダ式を使用すると、任意の最終変数または事実上最終変数(一度だけ割り当てられる)を参照できます。 変数に値が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
Java 8-メソッド参照
メソッド参照は、名前でメソッドを指すのに役立ちます。 メソッド参照は、「::」記号を使用して説明します。 メソッド参照は、メソッドの次のタイプを指すために使用することができます-
- 静的メソッド
- インスタンスメソッド
- 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
Java 8-機能的インターフェース
機能インターフェースには、表示する単一の機能があります。 たとえば、単一のメソッド「compareTo」を持つComparableインターフェースは、比較の目的で使用されます。 Java 8は、ラムダ式で広範囲に使用される多くの機能インターフェースを定義しています。 以下は、java.util.Functionパッケージで定義されている機能インターフェースのリストです。
以下は、Java8のインターフェースのリストです。
Sr.No. | Interface & Description |
---|---|
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つの2値オペランドに対する演算を表し、2値結果を生成します。 |
8 |
DoubleConsumer 単一の二重値引数を受け入れ、結果を返さない操作を表します。 |
9 |
DoubleFunction<R> 二重値の引数を受け入れ、結果を生成する関数を表します。 |
10 |
DoublePredicate 1つの二重値引数の述語(ブール値関数)を表します。 |
11 |
DoubleSupplier 二重値の結果のサプライヤを表します。 |
12 |
DoubleToIntFunction double値の引数を受け入れ、int値の結果を生成する関数を表します。 |
13 |
DoubleToLongFunction 二重値の引数を受け入れ、長い値の結果を生成する関数を表します。 |
14 |
DoubleUnaryOperator 二重値の結果を生成する単一の二重値オペランドの操作を表します。 |
15 |
Function<T,R> 1つの引数を受け入れて結果を生成する関数を表します。 |
16 |
IntBinaryOperator 2つのint値のオペランドに対する演算を表し、int値の結果を生成します。 |
17 |
IntConsumer 単一のint値の引数を受け入れ、結果を返さない操作を表します。 |
18 |
IntFunction<R> int値の引数を受け入れ、結果を生成する関数を表します。 |
19 |
IntPredicate 1つのint値引数の述語(ブール値関数)を表します。 |
20 |
IntSupplier int値の結果のサプライヤを表します。 |
21 |
IntToDoubleFunction int値の引数を受け入れ、2値の結果を生成する関数を表します。 |
22 |
IntToLongFunction int値の引数を受け入れ、長い値の結果を生成する関数を表します。 |
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> オブジェクト値およびint値の引数を受け入れ、結果を返さない操作を表します。 |
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)を備えた機能インターフェイスです。 このインターフェイスは、オブジェクトがtrueまたはfalseであることがテストされていることを示します。
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-デフォルトのメソッド
Java 8では、インターフェイスにデフォルトのメソッド実装という新しい概念が導入されています。 この機能は下位互換性のために追加されているため、古いインターフェイスを使用してJava 8のラムダ式機能を活用できます。
たとえば、「リスト」または「コレクション」インターフェースには「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 {
default void print() {
vehicle.super.print();
}
}
静的デフォルトメソッド
インターフェイスには、Java 8以降の静的ヘルパーメソッドを含めることもできます。
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!
Java 8-ストリーム
ストリームは、Java 8で導入された新しい抽象レイヤーです。 ストリームを使用すると、SQLステートメントと同様の宣言的な方法でデータを処理できます。 たとえば、次のSQLステートメントを考えます。
SELECT max(salary), employee_id, employee_name FROM Employee
上記のSQL式は、開発者の側で計算を行うことなく、給与を受け取る従業員の最大詳細を自動的に返します。 Javaのコレクションフレームワークを使用して、開発者はループを使用し、繰り返しチェックする必要があります。 もう1つの懸念は効率です。マルチコアプロセッサは簡単に利用できるため、Java開発者はエラーが発生しやすい並列コード処理を作成する必要があります。
このような問題を解決するために、Java 8は、開発者がデータを宣言的に処理し、特定のコードを記述することなくマルチコアアーキテクチャを活用できるストリームの概念を導入しました。
ストリームとは何ですか?
ストリームは、集約操作をサポートするソースからのオブジェクトのシーケンスを表します。 以下は、ストリームの特性です-
- 要素のシーケンス-ストリームは、特定のタイプの要素のセットを順次に提供します。 ストリームは、要求に応じて要素を取得/計算します。 要素を保存することはありません。
- ソース-ストリームは、コレクション、配列、またはI/Oリソースを入力ソースとして受け取ります。
- 集計操作-Streamは、フィルター、マップ、制限、削減、検索、一致などの集計操作をサポートします。
- パイプライン-ストリーム操作のほとんどは、結果をパイプライン化できるようにストリーム自体を返します。 これらの操作は中間操作と呼ばれ、その機能は入力を受け取り、処理し、出力をターゲットに返すことです。 collect()メソッドは、通常、パイプライン操作の最後に存在してストリームの終わりを示す端末操作です。
- 自動反復-明示的な反復が必要なコレクションとは対照的に、ストリーム操作は提供されたソース要素に対して内部的に反復を行います。
ストリームを生成する
Java 8では、CollectionインターフェイスにはStreamを生成する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
ストリームは、ストリームの各要素を反復処理する新しいメソッド「forEach」を提供します。 次のコードセグメントは、forEachを使用して10個の乱数を印刷する方法を示しています。
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
map
「map」メソッドは、各要素を対応する結果にマッピングするために使用されます。 次のコードセグメントは、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());
フィルタ
「フィルター」メソッドは、基準に基づいて要素を削除するために使用されます。 次のコードセグメントは、フィルターを使用して空の文字列の数を出力します。
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();
限定
「制限」メソッドは、ストリームのサイズを縮小するために使用されます。 次のコードセグメントは、制限を使用して10個の乱数を印刷する方法を示しています。
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
ソート済み
「ソート済み」メソッドは、ストリームのソートに使用されます。 次のコードセグメントは、ソートされた順序で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
Java 8-オプションのクラス
オプションは、null以外のオブジェクトを含むために使用されるコンテナオブジェクトです。 オプションのオブジェクトは、値が存在しない場合にnullを表すために使用されます。 このクラスには、null値をチェックする代わりに、値を「使用可能」または「使用不可」として処理するコードを容易にするさまざまなユーティリティメソッドがあります。 これはJava 8で導入され、グアバのオプションと似ています。
クラス宣言
以下は java.util.Optional <T> クラスの宣言です-
public final class Optional<T> extends Object
クラスメソッド
Sr.No. | Method & Description |
---|---|
1 |
static <T> Optional<T> empty() 空のOptionalインスタンスを返します。 |
2 |
boolean equals(Object obj) 他のオブジェクトがこのオプションと「等しい」かどうかを示します。 |
3 |
Optional<T> filter(Predicate<? super <T> predicate) 値が存在し、その値が特定の述語と一致する場合、値を説明するOptionalを返し、そうでない場合は空のOptionalを返します。 |
4 |
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) 値が存在する場合は、提供されたオプション軸受マッピング関数をその値に適用し、その結果を返します。それ以外の場合は空のオプションを返します。 |
5 |
T get() このOptionalに値が存在する場合は値を返し、そうでない場合は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でない場合、結果を説明するOptionalを返します。 |
10 |
static <T> Optional<T> of(T value) 指定された現在のnull以外の値でOptionalを返します。 |
11 |
static <T> Optional<T> ofNullable(T value) null以外の場合、指定された値を記述するOptionalを返します。それ以外の場合、空のOptionalを返します。 |
12 |
T orElse(T other) 存在する場合は値を返し、そうでない場合はその他を返します。 |
13 |
T orElseGet(Supplier<? extends T> 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-Nashorn JavaScript
Java 8では、既存のRhinoを置き換えるために、はるかに改善されたjavascriptエンジンであるNashornが導入されました。 Nashornは、メモリ内のコードを直接コンパイルし、バイトコードをJVMに渡すため、2〜10倍のパフォーマンスを提供します。 Nashornは、パフォーマンスを改善するためにJava 7で導入された呼び出しダイナミクス機能を使用しています。
jjs
Nashornエンジンの場合、JAVA 8では、コンソールでjavascriptコードを実行するための新しいコマンドラインツール jjs が導入されています。
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を使用すると、JavaでJavaScriptコードを呼び出して解釈できます。
例
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クラスをインポートして使用する方法を説明しています。
c:\> JAVAフォルダーに sample.js を作成して保存します。
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
Java 8では、新しいDate-Time APIが導入され、古いdate-time APIの次の欠点をカバーしています。
- 非スレッドセーフ-java.util.Dateはスレッドセーフではないため、開発者は日付の使用中に同時実行の問題に対処する必要があります。 新しい日時APIは不変であり、setterメソッドはありません。
- デザインが悪い-デフォルトの日付は1900から始まり、月は1から始まり、日は0から始まるので、均一性はありません。 古いAPIには、日付操作用の直接的なメソッドがあまりありませんでした。 新しいAPIは、このような操作のための多数のユーティリティメソッドを提供します。
- タイムゾーンの扱いが難しい-開発者はタイムゾーンの問題に対処するために多くのコードを書く必要がありました。 新しいAPIは、ドメイン固有の設計を念頭に置いて開発されました。
Java 8では、パッケージjava.timeの下に新しい日時APIが導入されています。 以下は、java.timeパッケージで導入された重要なクラスの一部です。
- ローカル-タイムゾーン処理の複雑さのない簡素化された日時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列挙型がJava 8に追加され、日、月などを表すために古い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つの特別なクラスが導入されています。
- 期間-日付ベースの時間を扱います。
- 期間-時間ベースの時間を扱います。
それらの動作を見てみましょう。
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-Time APIに変換できます。 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には、Base64エンコーディング用のエンコーダとデコーダが組み込まれています。 Java 8では、3種類のBase64エンコーディングを使用できます。
- シンプル-出力は、A-Za-z0-9 +/にある文字セットにマッピングされます。 エンコーダーは出力に改行を追加せず、デコーダーはA-Za-z0-9 +/以外の文字を拒否します。
- URL -出力は、A-Za-z0-9 + _にある文字セットにマッピングされます。 出力はURLおよびファイル名に対して安全です。
- MIME -出力はMIMEフレンドリ形式にマップされます。 出力は、それぞれ76文字以下の行で表され、改行文字 '\ n’に続く改行文字 '\ r’を使用します。 エンコードされた出力の最後に行区切り記号はありません。
入れ子クラス
Sr.No. | Nested class & Description |
---|---|
1 |
static class Base64.Decoder このクラスは、RFC 4648およびRFC 2045で指定されているBase64エンコードスキームを使用してバイトデータをデコードするためのデコーダーを実装します。 |
2 |
static class Base64.Encoder このクラスは、RFC 4648およびRFC 2045で指定されているBase64エンコードスキームを使用してバイトデータをエンコードするためのエンコーダーを実装します。 |
方法
Sr.No. | Method Name & Description |
---|---|
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(
"finddevguides?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(
"finddevguides?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: finddevguides?java8
Base64 Encoded String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg=
Base64 Encoded String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJl
NTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQz
NDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1
MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2
Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5
YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFk
LWJiM2UtM2JhYzUxYzI5OWI4