Javaの1.8とJavaの間に導入されたプログラミング機能を簡単に見る



あなたのJavaコードを現代の標準に忠実にする特徴
Photo by Reka Illyes on Unsplash
Javaは実質的に1.8から17になりました、そして、今年のバージョン18はリリースのために予定されています.この記事では、我々は、第17バージョンから17日までリリースされた機能をカバーしようとします.
これは長いリストになるので、ステージを設定するにはあまり時間を費やすことはありません.
以下のリストは、各リリースで導入されたすべての機能と変更をカバーしていないことに注意してください、しかし、典型的なプログラミングケースで最も有用であり、プログラミングをより面白く、簡単になります.

ジャバ8
ラムダ
ラムダ式は、関数引数をメソッド引数として使用します.Java 8の前のコードを見てみましょう.単純なインターフェイスを実装する匿名クラスを作成しなければなりません.
Thread t = new Thread( new Runnable() {
 public  void run() {
  System.out.println("Start thread");
 }
});
ラムダ式を使用すると、1行のクラスのインスタンスを表現できます
Thread t1 = new Thread(() -> {
 System.out.println("Start 1st thread");
});
機能的インタフェース
関数インターフェイスは、1つの抽象メソッドのみを持つインターフェイスです.さらに、インターフェイスはデフォルトと静的メソッドを持つことができますが、1つの抽象メソッドのみです.
私たちは、previous articleでこれらの特徴を長さでカバーしました、例のためにその記事を参照してください.
ストリーム
streamはJavaのインターフェースです.Utilコレクション上のシーケンシャルおよび並列操作を実行する方法を提供するストリームパッケージ.
コレクションインターフェイスのstream ()メソッドは、ストリーム型のコレクションの要素のストリームを返します.
ストリームインターフェイスは、ストリーム内の要素の集約結果をフィルター処理またはマップするために必要な操作をサポートします.
以下の例では、リストのstream ()メソッドを呼び出し、述語( function interface )をbooleanメソッドを返します.
List<String> colors = new ArrayList<>(Arrays._asList_("Green","Yellow","Red"));

boolean isTrue = colors.stream().anyMatch(x -> x.equals("Red"));

System.out.println(isTrue);
オプション
オプションは非NULL値を含んでいても構いません.オプションを指定すると、値がNULLでないかどうかをチェックできます.
以下のサンプルコードでは、任意のオブジェクトを返すストリームインターフェイスのフィンダナ()メソッドを使用します.オプションのインスタンスの値に基づいて、対応する論理を実行できます.
8以前のJavaバージョンで同様の操作を行うには、文字列を明示的にnullチェックする必要があります.
List<String> colors = new ArrayList<>(Arrays._asList_("Green","Yellow","Red"));

Optional<String> color = colors.stream().filter(x -> x.equals("Black")).findAny();

System.out.println(color.isPresent()? color.get() : "Not Found");
Javaの変更.Util同時パッケージ
「完了」「完了」「クラス」「完了」「クラス」「完了」「完了」「例外」をJava 8で導入しました.
Definablefutureは、Java 8より前に存在した将来のオブジェクトよりもはるかに柔軟で拡張された非同期タスクを実行するのに役立ちます.
以前の記事では並行したパッケージと将来をすでにカバーしているので、現在の記事のサンプルコードを分析することはできません.
メソッド参照(:::
ダブルコロンは、ラムダ式を使用する代わりに既存のメソッドを呼び出すのに使用できます.
メソッドリファレンスを使用して静的メソッドとインスタンスメソッドを参照できます.静的メソッドを参照してください.
まず、ラムダ式を使ってメソッド呼び出しを実装しましょう.
public class Main {

public static void main(String[] args) {
 List<Integer> locList = **new** ArrayList<>(Arrays._asList_(1,2,5,6));
 boolean isFound = locList.stream().anyMatch(l -> _isEqual_(l));
 System.out.println(isFound);
}

public static <T> boolean isEqual(T a) {
Predicate<T> isEqual = (x) -> x.equals(5);
return isEqual.test(a);
}
}
Isequal ()は、クラスmainの静的メソッドで、メソッドを呼び出すためにラムダ式を使用する代わりに、単にメソッドリファレンスを使用してジョブを取得できます.
public class Main {

public  static  void main(String[] args) {
 List<Integer> locList = new ArrayList<>(Arrays._asList_(1,2,5,6));
 boolean isFound = locList.stream().anyMatch(Main::_isEqual_);
 System.out.println(isFound);
}

public static <T> boolean isEqual(T a) {
 Predicate<T> isEqual = (x) -> x.equals(5);
 return isEqual.test(a);
}
}

ジャワ9
ストリーム無効の
Java 8以降、ストリームを使用して要素のストリームを作成できます.( Object ...)値のJava 9からストリームを使用できます.単一の要素を使用してストリームを作成したり、空のストリームを返したりできます.
List<Location> locList = **new** ArrayList<>(Arrays._asList_(loc, loc1, loc2));
Stream._ofNullable_(locList);
インターフェイスのプライベートメソッド
Java 8はインタフェースにおけるデフォルトメソッドの概念を導入した.つ以上のデフォルトメソッドが同じロジックを共有したい場合は、プライベートロジックを使用して共通のロジックを実装できます.
ジャバモジュール
Javaモジュールはそれ自身の記事に値するが、それが何であるかについて簡単に見ましょう.Javaモジュールは、パッケージとその関連リソースをグループ化することができるテクニックです.モジュールには、モジュール名、依存モジュール、その他のモジュールで利用可能なパッケージを指定するモジュール記述子が含まれます.
最後の目標の一つは、実行時にアプリケーションのサイズを小さくすることです.GUIを使用していない場合は、そのモジュールをアプリケーション内の依存関係として追加する必要はありません.

ジャバ10
局所変数型推論
Java 10以降では、非NULLのローカル変数を初期化でき、型varに割り当てることができます.
サンプルの使用方法を以下に示します.
public class Sample {

public  static  void main(String[] args) {

var x = 10;
var y = 11;
System.out.println(x + y);

var obj = new TryVar();
System.out.println(obj.getName());

var c; //Illegal, Compiler will throw an error -> "Cannot use 'var' on variable without initializer"
}
}

class TryVar {
 String name;

 public String getName() {
  return "my name";
 }
}

ジャバ11
オプションの新しいメソッド
Java 8の機能のもとで、オプションを使用して明示的なnullチェックを置き換える方法を学びました.ispresent ()メソッド.
Java 11以降、オプションを使用して同様のチェックを行うことができます.それに基づいてbooleanを返すisempty ()メソッドもNULLです.

ジャバ12
コレクターズ.put ()
teeing()は、2つの下流のコレクターの複合体であるコレクタを返します.
例を挙げましょう.この例では、2つの変数xとyがある場所という名前のクラスを使用します.Teeingの例では、Xのために受け入れられた値を持つレコードの数とyに対する受け入れられた値を取得します😝 )
//Create three instances of Location
Location loc = new Location(2.2, 3.6);
Location loc1 = new Location(2.4, 3.3);
Location loc2 = new Location(2.3, 3.2);

// Add the reference variables to an ArrayList
List<Location> locList = **new** ArrayList<>(Arrays._asList_(loc, loc1, loc2));

//Count records that has correct x, Count the records that has correct y and create a new Location object  
var result = locList.stream().collect(Collectors._teeing_(Collectors._filtering_(Location :: isXFound, Collectors._counting_()),Collectors._filtering_(Location :: isYFound, Collectors._counting_()), Location :: new ));

//Print the Result
System.out.println("Records with correct X coordinate " + result.getX() + " :: Records with correct Y coordinate " + result.getY());
クラスの場所は以下のようになります.
< div >
< H 4 >

ジャバ13
<高橋潤子>
テキストブロック


テキストブロックは、複数行文字列を表すために必要なJava構文を最小化します.p >
従来はダブルクォート内で追加された文字列の代わりに使用できます.p >
テキストブロックの前に、複数行の文字列を印字しなければならない場合、デリミタ、連結などを使用する必要があります.
例えば、以下のコードは完全な文字列を一つの行に与えます
<> P >
クラスをハイライト表示する
System.out.print("Hey There "

+ "What's up?? "

+ "How was your vacation?? "

+ ";)");
< div >
<出力> < br/>
<> P >
クラスをハイライト表示する
Hey There What's up?? How was your vacation?? ;)
< div >
次の行で印字するには、上記のコードを以下のように修正しなければなりません.< br/>
<> P >
クラスをハイライト表示する
System.out.print("Hey There \n"

+ "What's up?? \n"

+ "How was your vacation?? \n"

+ ";)");
< div >
テキストブロックを使用することで、上記のコードを書き換えることができます.
<> P >
クラスをハイライト表示する
System.out.print("""

Hey There

What's up??

How was your vacation??

;)

""");
< div >
テキストブロックは標準文字列の代わりに使用することもできます.p >
例えば、以下に示す文字列は両方とも同じ意味を持ちます.
<> P >
クラスをハイライト表示する
_//Text Block  
printMsg_ ("""
Print This!! """);

// String in Double Quotes
_printMsg_("Print this!");
< div >
< H 4 >

ジャバ14
<高橋潤子>
< em >< em >レコード< em >
レコードは、POJOに理想的なクラスの制限された形式です.標準のデータキャリアクラスには、コンストラクタやgetter/settersと一緒にいくつかのプライベートフィールドがあります.p >
< br/>二つのメンバを持つ単純なデータキャリアクラスの例をチェックしましょう
<> P >
クラスをハイライト表示する
public  class Location {
double x;
double y;

public Location(double x, double y) {
this.x = x;
this.y = y;
}

public double getX() {
 return x;
}

public double getY() {
 return y;
}
}
< div >
下記のコードを使って上記のクラスを書き換えます.
<> P >
クラスをハイライト表示する
record NewLocation( **double** x, **double** y) {}
< div >
レコードは、実行時にgettersとコンストラクタを取得します.また、equals ()、hashcode ()およびtostring ()メソッドを取得します.p >
< H 4 >

ジャバ15
<高橋潤子>
< tag >< em >密封されたクラス
シールは、クラスとインターフェイスに追加できる修飾子です.密封されたクラスは、それを広げることができるサブクラスを決定することができて、そうすることから他のクラスを止めることができますp >
<p>封印されたクラス/インターフェイスを宣言するには、“密閉”修飾子を追加し、次に拡張モジュールや実装を追加する必要があります.「許可」は、それを広げることが許されるサブクラスの名前に続きますp >
他の条件は、密閉クラスを拡張するサブクラスは1とすることができます.ファイナル — これはさらなる拡張から停止します.
< OL >
シールされる
  •  — これによって、密封されたサブクラスはそれ自身の許可されたサブクラスであると定義されます.
  • 非シール — 任意のarbtraryクラスを拡張しましょう.
  • < OL >
    例えば、位置が密封されたクラスであるならば、我々はそれを< br/>と宣言することができます
    <> P >
    クラスをハイライト表示する
    public  sealed  class Location permits SubLocation
    
    < div >
    とサブロケーションクラスは< br/>と宣言できます
    <> P >
    クラスをハイライト表示する
    public  final  class SubLocation extends Location{}
    
    < div >
    < p >あるいは< br/>
    <> P >
    クラスをハイライト表示する
    public  sealed  class SubLocation extends Location permits AnotherClass{}
    
    < div >
    < p >あるいは< br/>
    <> P >
    クラスをハイライト表示する
    public non-sealed class SubLocation extends Location{}
    
    < div >
    < H 4 >

    ジャバ16
    <高橋潤子>
    ストリーム.tolist () < p/p >
    Java 16からの< p >では、コレクターを使う代わりにストリームから直接リストへの結果を収集できます.tolist ()も参照ください.br/>
    <> P >
    クラスをハイライト表示する
    List<Integer> collectedList = locList.stream().filter( l -> l >=2).collect(Collectors._toList_());
    
    < div >
    上記コードは以下のような結果を得ます.
    <> P >
    クラスをハイライト表示する
    List<Integer> collectedListNew = locList.stream().filter( l -> l >=2).toList();
    
    < div >
    < H 4 >

    ジャバ17
    <高橋潤子>
    < em >< em >スイッチ< em/>> < p/p >
    スイッチケースで定数値を使用する代わりに、caseラベルとしてパターンを使用することができます.p >
    < hr/>