Java 8 チュートリアル
「Javaはまだ生きており、人々はそれを理解し始めています。」
Java 8 へようこそ。この記事では、Java 7 から Java 8 までのすべての新機能を段階的に説明します。簡単で簡単なコード例を使用して、デフォルト インターフェイス、メソッド
参照、
およびメソッドの使用方法を学ぶことができます。
反復可能な注釈。この記事の最後では、Stream API について説明します。
不必要なおしゃべりは不要です。コードとコメントだけです。フォワード!
インターフェイスのデフォルトのメソッド
Java 8 では、. を追加することで、(実装された) 非抽象メソッドをインターフェイスに追加できます
default
。
この機能は、拡張メソッドとも呼ばれます。以下に最初の例を示します。
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
抽象メソッドに加えて
calculate
、インターフェイスは
Formula
デフォルト メソッドも定義します
sqrt
。このインターフェイスを実装するクラスは、 を実装するだけで済みます
calculate
。デフォルトの方法は
sqrt
そのまま使用できます。
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};
formula.calculate(100);
formula.sqrt(16);
インターフェイスは
Formula
匿名クラスとして実装されます。コードは冗長です。実装には 6 行あります
sqrt(a * 100)
。次のセクションで説明するように、Java 8 には単一のメソッドを実装するためのより適切な方法があります。
ラムダ式
Java の以前のバージョンで文字列のリストを並べ替える簡単な例から始めましょう。
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
静的メソッドは、
Collections.sort
リストとコンパレーターを、リストがソートされる順序で受け入れます。いつでも匿名のコンパレータ クラスを作成して渡すことができます。Java 8 では、匿名クラスを作成する代わりに、より短い形式のラムダ式を作成できます。
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
ご覧のとおり、コードははるかに短くなり、読みやすくなります。しかし、これはさらに短くすることもできます。
Collections.sort(names, (String a, String b) -> b.compareTo(a));
本文が 1 行の場合は、
{}
単語をスキップできます
return
。ただし、さらに短くすることもできます。
Collections.sort(names, (a, b) -> b.compareTo(a));
Java コンパイラは引数の型を認識しているため、それらをスキップすることもできます。ラムダ式をさらに深く掘り下げて、その使用方法を理解しましょう。
機能インターフェイス
ラムダ式は Java の型システムにどのように適合しますか? 各ラムダは、インターフェイスに記述された型に対応します。したがって、関数インターフェイスには抽象メソッドを 1 つだけ含める必要があります。このタイプの各ラムダ式は、この抽象メソッドに対応します。デフォルト メソッドは抽象メソッドではないため、必要に応じて関数型インターフェイスでデフォルト メソッドを自由に作成できます。このインターフェイスに抽象メソッドが 1 つしかない場合は、任意のインターフェイスをラムダ式として使用することもできます。
@FucntionalInterface
これらの要件を満たすには、注釈を追加する必要があります。コンパイラはそれを認識しているため、複数の抽象メソッドを提供したい場合は例外をスローします。例:
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);
@FunctionalInterface
注釈が省略された 場合でもコードはコンパイルされることに注意してください。
メソッドとコンストラクターのリファレンス
上記の例は、メソッド参照を使用してさらに小さくすることもできます。
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);
Java 8 では、 を追加することでメソッドまたはコンストラクターに参照を渡すことができます
::
。上の例は、静的メソッドを参照する方法を示していますが、非静的メソッドを参照することもできます。
class Something {
String startsWith(String s) {
return String.valueOf(s.charAt(0));
}
}
Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);
コンストラクターでどのように動作するかを見てみましょう
::
。まず、さまざまなコンストラクターを使用してサンプル クラスを定義します。
class Person {
String firstName;
String lastName;
Person() {}
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
次に、新しいオブジェクトを作成するためのインターフェイスを定義します。
interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
}
作成ファクトリーを実装する代わりに、コンストラクターのヘルプを使用してすべてを結び付けます
::
。
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
を介してコンストラクターへのリンクを作成しました
Person::new
。Java コンパイラは、メソッド シグネチャに一致する正しいコンストラクタを自動的に選択します
PersonFactory.create
。... つづく。残念ながら、記事の下書きを保存する方法が見つかりませんでした。これは本当に奇妙です。翻訳の時間が終わったので、後で完成させます。英語を知っていて理解できるすべての人向け -
オリジナル記事。翻訳を修正するための提案がある場合は、利用可能な方法で書いてください。
私のGithubアカウント
GO TO FULL VERSION