prominent java 8 features with code examples
例を含むJava8リリースで導入されたすべての著名な機能の包括的なリストと説明:
リンクリストノードc ++
OracleからのJava8リリースは、世界一の開発プラットフォームの革新的なリリースでした。これには、JVM、Java言語、およびライブラリーの進化とともに、Javaプログラミングモデル全体の大幅なアップグレードが含まれていました。
このリリースには、使いやすさ、生産性、ポリグロットプログラミングの改善、セキュリティ、および全体的なパフォーマンスの改善のためのいくつかの機能が含まれていました。
学習内容:
Java8リリースに追加された機能
主な変更点の中で、このリリースに追加された注目すべき機能は次のとおりです。
- 機能インターフェイス およびラムダ式
- IterableインターフェイスのforEach()メソッド
- オプションのクラス、
- インターフェイスのデフォルトメソッドと静的メソッド
- メソッドリファレンス
- コレクションのバルクデータ操作用のJavaStream API
- Java日時API
- コレクションAPIの改善
- 並行性APIの改善
- JavaIOの改善
- RhinocerosJavaScriptエンジン
- Base64エンコードデコード
- その他のコアAPIの改善
このチュートリアルでは、これらの各機能について簡単に説明し、簡単で簡単な例を使用してそれぞれについて説明します。
関数型インターフェースとラムダ式
Java 8では、@ FunctionalInterfaceと呼ばれるアノテーションが導入されています。これは通常、コンパイラレベルのエラー用です。これは通常、使用しているインターフェースが機能インターフェースの契約に違反している場合に使用されます。
または、機能インターフェイスをSAMインターフェイスまたはシングル抽象メソッドインターフェイスとして呼び出すこともできます。機能インターフェイスでは、メンバーとして1つの「抽象メソッド」を使用できます。
以下に、機能インターフェイスの例を示します。
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
アノテーション@FunctionalInterfaceは省略でき、機能インターフェイスは引き続き有効です。このアノテーションは、インターフェースに単一の抽象メソッドがあることをコンパイラーに通知するためにのみ使用します。
注意: 定義上、デフォルトのメソッドは非抽象的であり、機能インターフェイスに必要な数のデフォルトのメソッドを追加できます。
次に、インターフェースに「java.lang.object」のパブリックメソッドの1つをオーバーライドする抽象メソッドがある場合、それはインターフェースの抽象メソッドとは見なされません。
以下に、有効な機能インターフェイスの例を示します。
@FunctionalInterface public interface FunctionalInterface_one { public void firstInt_method(); @Override public String toString(); //Overridden from Object class @Override public boolean equals(Object obj); //Overridden from Object class }
ラムダ式(または関数)は、無名関数(名前と識別子のない関数)として定義できます。ラムダ式は、通常、他の関数のパラメーターとして、必要な場所で正確に定義されます。
別の観点から、ラムダ式は次のインスタンスを表現します 機能インターフェイス (上記)。ラムダ式は、関数型インターフェースに存在する唯一の抽象関数を実装するため、関数型インターフェースを実装します。
ラムダ式の基本的な構文は次のとおりです。
ラムダ式の基本的な例は次のとおりです。
上記の式は、2つのパラメーターxとyを取り、その合計x + yを返します。 xとyのデータ型に基づいて、このメソッドはさまざまな場所で複数回使用できます。したがって、パラメーターxとyはintまたは整数と文字列に一致し、コンテキストに基づいて、2つの整数を追加するか(パラメーターがintの場合)、2つの文字列を連結します(パラメーターが文字列の場合)。
ラムダ式をデモンストレーションするプログラムを実装しましょう。
interface MyInterface { void abstract_func(int x,int y); default void default_Fun() { System.out.println('This is default method'); } } class Main { public static void main(String args()) { //lambda expression MyInterface fobj = (int x, int y)->System.out.println(x+y); System.out.print('The result = '); fobj.abstract_func(5,5); fobj.default_Fun(); } }
出力:
上記のプログラムは、ラムダ式を使用してパラメーターに追加し、それらの合計を表示する方法を示しています。次に、これを使用して、インターフェイス定義で宣言した抽象メソッド「abstract_fun」を実装します。関数「abstract_fun」を呼び出した結果は、関数の呼び出し中にパラメーターとして渡された2つの整数の合計です。
ラムダ式については、チュートリアルの後半で詳しく説明します。
例を含むUNIXのsortコマンド
Iterable InterfaceのforEach()メソッド
Java 8は、コレクション内の要素を反復処理できる「forEach」メソッドをインターフェースjava.lang.Iterableに導入しました。 「forEach」は、Iterableインターフェースで定義されているデフォルトのメソッドです。これは、要素を反復するためにIterableインターフェイスを拡張するCollectionクラスによって使用されます。
「forEach」メソッドは、Functional Interfaceを単一のパラメーターとして受け取ります。つまり、Lambda式を引数として渡すことができます。
forEach()メソッドの例。
importjava.util.ArrayList; importjava.util.List; public class Main { public static void main(String() args) { List subList = new ArrayList(); subList.add('Maths'); subList.add('English'); subList.add('French'); subList.add('Sanskrit'); subList.add('Abacus'); System.out.println('------------Subject List--------------'); subList.forEach(sub -> System.out.println(sub)); } }
出力:
したがって、サブジェクトのコレクション、つまりサブリストがあります。 Lambda式を使用して各要素を出力するforEachメソッドを使用して、サブリストの内容を表示します。
オプションクラス
Java 8では、「java.util」パッケージにオプションのクラスが導入されました。 「オプション」はパブリック最終クラスであり、JavaアプリケーションでNullPointerExceptionを処理するために使用されます。オプションを使用して、実行する代替コードまたは値を指定できます。オプションを使用すると、nullPointerExceptionを回避するために多くのnullチェックを使用する必要がなくなります。
オプションクラスを使用すると、プログラムの異常終了を回避し、プログラムのクラッシュを防ぐことができます。オプションクラスは、特定の変数の値の存在を確認するために使用されるメソッドを提供します。
次のプログラムは、Optionalクラスの使用法を示しています。
import java.util.Optional; public class Main{ public static void main(String() args) { String() str = new String(10); OptionalcheckNull = Optional.ofNullable(str(5)); if (checkNull.isPresent()) { String word = str(5).toLowerCase(); System.out.print(str); } else System.out.println('string is null'); } }
出力:
このプログラムでは、Optionalクラスの「ofNullable」プロパティを使用して、文字列がnullかどうかを確認します。そうである場合、適切なメッセージがユーザーに出力されます。
インターフェイスのデフォルトメソッドと静的メソッド
Java 8では、抽象的ではないメソッドをインターフェースに追加できます。つまり、メソッドを実装するインターフェースを持つことができます。 DefaultおよびStaticキーワードを使用して、メソッド実装のインターフェイスを作成できます。デフォルトのメソッドは、主にラムダ式機能を有効にします。
デフォルトのメソッドを使用して、ライブラリのインターフェイスに新しい機能を追加できます。これにより、古いバージョン用に記述されたコードがそれらのインターフェースと互換性があることが保証されます(バイナリ互換性)。
例を挙げてデフォルトの方法を理解しましょう。
import java.util.Optional; interface interface_default { default void default_method(){ System.out.println('I am default method of interface'); } } class derived_class implements interface_default{ } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); obj1.default_method(); } }
出力:
デフォルトの実装を持つメソッドdefault_method()を持つ「interface_default」という名前のインターフェースがあります。次に、インターフェース「interface_default」を実装するクラス「derivated_class」を定義します。
このクラスにはインターフェイスメソッドを実装していないことに注意してください。次に、main関数で、クラス「derivated_class」のオブジェクトを作成し、クラスで定義しなくても、インターフェイスの「default_method」を直接呼び出します。
これは、インターフェイスでのデフォルトメソッドと静的メソッドの使用です。ただし、クラスでデフォルトのメソッドをカスタマイズする場合は、メソッドをオーバーライドすることで独自の実装を提供できます。
メソッドリファレンス
Java 8で導入されたメソッド参照機能は、Lambda式がFunctionalInterfaceのメソッドを呼び出すための省略表記です。したがって、ラムダ式を使用してメソッドを参照するたびに、ラムダ式をメソッド参照に置き換えることができます。
メソッドリファレンスの例。
import java.util.Optional; interface interface_default { void display(); } class derived_class{ public void classMethod(){ System.out.println('Derived class Method'); } } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); interface_default ref = obj1::classMethod; ref.display(); } }
出力:
このプログラムには、抽象メソッド「display()」を持つインターフェース「interface_default」があります。次に、メッセージを出力するパブリックメソッド「classMethod」を持つクラス「derivated_class」があります。
loadrunnerを使用したWebサービスのパフォーマンステスト
main関数には、クラスのオブジェクトがあり、次にobj1(クラスオブジェクト)を介してクラスメソッド「classMethod」を参照するインターフェイスへの参照があります。これで、抽象メソッドの表示がインターフェース参照によって呼び出されると、classMethodの内容が表示されます。
コレクションのバルクデータ操作用のJavaStream API
Stream APIは、Java 8で導入されたもう1つの大きな変更です。StreamAPIは、オブジェクトのコレクションを処理するために使用され、異なるタイプの反復をサポートします。ストリームは、さまざまなメソッドをパイプライン化して目的の結果を生成できるようにする一連のオブジェクト(要素)です。
ストリームはデータ構造ではなく、コレクション、配列、またはその他のチャネルから入力を受け取ります。 Streamsを使用してさまざまな中間操作をパイプライン化でき、ターミナル操作は結果を返します。ストリームAPIについては、別のJavaチュートリアルで詳しく説明します。
Java日時API
Java 8では、java.timeパッケージの下に新しい日時APIが導入されています。
それらの中で最も重要なクラスは次のとおりです。
- 地元: タイムゾーン処理の複雑さのない単純化された日時API。
- ゾーン化: さまざまなタイムゾーンを処理するための特殊な日時API。
日付
日付クラスはJava8で廃止されました。
導入された新しいクラスは次のとおりです。
- LocalDateクラス 日付を定義します。時間またはタイムゾーンの表現はありません。
- LocalTime クラス 時間を定義します。日付やタイムゾーンの表現はありません。
- LocalDateTimeクラス 日時を定義します。タイムゾーンの表現はありません。
日付機能にタイムゾーン情報を含めるには、OffsetDate、OffsetTime、OffsetDateTimeの3つのクラスを提供するLambdaを使用できます。ここで、タイムゾーンオフセットは、別のクラス「ZoneId」を使用して表されます。このトピックについては、このJavaシリーズの後半で詳しく説明します。
RhinocerosJavaScriptエンジン
Java 8では、JavaScript用に大幅に改善されたエンジン、つまり既存のRhinoを置き換えるNashornが導入されました。 Nashornはメモリ内のコードを直接コンパイルしてから、バイトコードをJVMに渡すことで、パフォーマンスを10倍向上させます。
Nashornは、コンソールでJavaScriptコードを実行するjjsという新しいコマンドラインツールを導入しました。
次のコードを含むJavaScriptファイル「sample.js」を作成しましょう。
print (‘Hello, World!!’);
コンソールで次のコマンドを実行します。
C: Java jjs sample.js
出力: こんにちは世界!!
JavaScriptプログラムをインタラクティブモードで実行したり、プログラムに引数を提供したりすることもできます。
Base64エンコードデコード
Java 8には、Base64エンコーディング用の組み込みのエンコードとデコードがあります。 Base64エンコーディングのクラスはjava.util.Base64です。
このクラスは、3つのBase64エンコードとデコーダーを提供します。
- 基本: この場合、出力はA-Za-z0-9 + /の間の文字セットにマップされます。エンコーダーによって出力に改行が追加されることはなく、デコーダーは上記以外の文字を拒否します。
- URL: ここでの出力はURLであり、ファイル名セーフはA-Za-z0-9 + /の間の文字セットにマップされます。
- MIME: このタイプのエンコーダーでは、出力はMIMEフレンドリ形式にマップされます。
コレクションAPIの改善
Java 8は、コレクションAPIに次の新しいメソッドを追加しました。
- forEachRemaining(コンシューマーアクション):これはデフォルトのメソッドであり、イテレーター用です。すべての要素が処理されるか、「アクション」が例外をスローするまで、残りの各要素に対して「アクション」を実行します。
- コレクションのデフォルトメソッドremoveIf(述語フィルター):これにより、指定された「フィルター」を満たすコレクション内のすべての要素が削除されます。
- Spliterator():これは収集メソッドであり、要素を順次または並列にトラバースするために使用できるスプリッターインスタンスを返します。
- マップコレクションには、replaceAll()、compute()、merge()メソッドがあります。
- キーの衝突を伴うHashMapクラスが改善され、パフォーマンスが向上しました。
同時実行APIの変更/拡張
ConcurrentAPIの重要な拡張機能は次のとおりです。
- ConcurrentHashMapは、次のメソッドで拡張されています。
- 計算()、
- forEach()、
- forEachEntry()、
- forEachKey()、
- forEachValue()、
- 行く()、
- 削減()および
- 探す ()
- エグゼキュータのメソッド「newWorkStealingPool()」は、ワークスティーリングスレッドプールを作成します。使用可能なプロセッサをターゲットの並列処理レベルとして使用します。
- メソッド「completableFuture」は、(値とステータスを設定することにより)明示的に完了することができるメソッドです。
JavaIOの改善
Java8で行われたIOの改善には次のものがあります。
- Files.list(パスディレクトリ): これにより、各要素がディレクトリ内のエントリである、人口の多いストリームが返されます。
- Files.lines(パスパス): ストリームからすべての行を読み取ります。
- Files.find(): 指定された開始ファイルをルートとするファイルツリーでファイルを検索し、パスが入力されたストリームを返します。
- BufferedReader.lines(): BufferedReaderから読み取られた行として、すべての要素を含むストリームを返します。
その他のコアAPIの改善
以下のその他のAPIの改善があります。
- インスタンスを簡単に作成するためのThreadLocalのInitial(サプライヤーサプライヤー)を使用した静的メソッド。
- インターフェイス「コンパレータ」は、自然な順序の逆順などのデフォルトおよび静的メソッドで拡張されています。
- Integer、Long、およびDoubleラッパークラスには、min()、max()、およびsum()メソッドがあります。
- ブールクラスは、logicalAnd()、logicalOr()、logicalXor()メソッドで拡張されています。
- Mathクラスにはいくつかのユーティリティメソッドが導入されています。
- JDBC-ODBCブリッジが削除されました。
- PermGenのメモリスペースが削除されます。
結論
このチュートリアルでは、Java8リリースに追加された主な機能について説明しました。 Java 8はJavaからのメジャーリリースであるため、このリリースの一部として行われたすべての機能と拡張機能を知っておくことが重要です。
最新のJavaバージョンは13ですが、Java8の機能に慣れておくことをお勧めします。このチュートリアルで説明されているすべての機能は、最新バージョンのJavaにも引き続き存在し、このシリーズの後半で個別のトピックとして説明します。
このチュートリアルが、Java8のさまざまな機能について学ぶのに役立つことを願っています。