デフォルトのインターフェース方法
Java 8では、default
キーワードを使用して、非抽象メソッドの実装をインターフェイスに追加でき ます。この関数は、仮想拡張メソッドとも呼ばれます。これは比較的大きな変更です。以前は、インターフェイスにはメソッド定義しか存在できないが、メソッドは実装できないという認識がありました。デフォルトのキーワードを使用すると、次のように、メソッドの特定のコンテンツをインターフェイスに実装できます。
interface Formula{
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
利点は、インターフェイスを拡張するときに、インターフェイスのすべての実装クラスを1つずつ変更する必要がないことです。素晴らしいアップデート。
ラムダ式
ラムダ式を使用すると、次のように内部オブジェクトの記述を簡略化すると便利です。
/**
*以往的写法
*/
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(names, (String a, String b) -> {
return b.compareTo(a);
});
単純化はほんの少しではなく、コードロジックはより明確です。ラムダ式が内部クラスで記述されている場合、外部変数はfinalなしで呼び出すことができますが、外部変数は以前と同じであり、変更できません。それ以外の場合はコンパイルできません。
機能的なインターフェース
機能インターフェイスは、融合ラムダ式の拡張です。その定義は非常に単純です。インターフェイスにメソッドが1つしかない限り、インターフェイスは機能インターフェイスです(メソッドは1つだけで、このインターフェイスの機能は機能と同じくらい単一です)。java.lang.Runnable
そして java.util.concurrent.Callable
、機能インターフェイスの2つの最も典型的な例です。@FunctionalInterfaceを追加するかどうかは関係ありません。Jvmが判断できます。通常、@FunctionalInterface
アノテーションを使用してインターフェイスで宣言することをお勧めします。この場合、このアノテーションのあるインターフェイスに複数の抽象メソッドがあることが検出されると、コンパイラはエラーを報告します。使用法は次のとおりです。
Runnable runnable=()->{
System.out.print("这里是自定义的run方法....");
};
//对比以前的写法:
Runnable run=new Runnable() {
@Override
public void run() {
}
};
書くのはとても便利です。
ストリーム
Java 8は、コレクションクラスを拡張します。Collection.stream()またはCollection.parallelStream()を使用してストリームを作成し、java.util.Stream
要素のセットに一度に適用できる一連の操作を表すことができます。率直に言って、フィルタリング、並べ替え、照合など、コレクションタイプの要素のセットに対していくつかの操作を実行できます。戻り値は操作のコピーであり、元のデータに影響を与えないことに注意してください。フィルタ)例として:
//这个是操作的list,元素假设是[a1,b1,c1,d1]
stringList
.stream()
.filter((s) -> s.startsWith("a"))
.forEach(System.out::println);//a1