JDK 8の新機能
Java 5の関連機能
一般的な構文のいくつかはJava 5で導入され、JDK 8の機能を学ぶ際にしばしば一緒に使用されます。
列挙する
列挙は、定数の固定セットを表す特別な型です。列挙定数は列挙体の先頭に書く必要があります。
public enum Week {
MON("星期一"),
TUE("星期二"),
WED("星期三"),
THU("星期四"),
FRI("星期五"),
SAT("星期六"),
SUN("星期日");
private final String chineseName;
Week(String chineseName) {
this.chineseName = chineseName;
}
public String getChineseName() {
return chineseName;
}
}列挙定数は型定義後に追加または削除できません。列挙オブジェクトのプロパティは通常不変プロパティとして設計される。
可変パラメータ
可変パラメータにより、メソッドを呼び出すときに同じ型の引数を不定数渡すことができます。メソッドは可変パラメータを1つ以上持つことができ、引数リストの最後に配置する必要があります。
public class Test {
public static void method(String text, int... numbers) {
System.out.println(text);
for (int number : numbers) {
System.out.println(number);
}
}
public static void main(String[] args) {
method("abc", 1, 2, 3, 4);
}
}メソッド内では、変数パラメータは配列として使用されます。
JDK 8の主な特長
インタフェースデフォルト·メソッドと静的メソッド{{いんたふぇ ーすでふぉるとめそっど}}
JDK 8では、インタフェースはデフォルトメソッドと静的メソッドを定義できます。デフォルトのメソッドはdefault修飾を使用し、主にインターフェイスを拡張する際に既存の実装クラスと互換性を持つために使用されます。
public interface ITest {
void method();
default void method1() {
System.out.println("默认方法");
}
static void method2() {
System.out.println("静态方法");
}
}関数型インターフェース
抽象メソッドが1つしかないインタフェースは関数インタフェースと呼ばれる。関数インタフェースは抽象メソッドではないため、デフォルトメソッドと静的メソッドを含めることができます。
@FunctionalInterface注釈は、インタフェースが機能インタフェースの要件を満たしているかどうかを検証するために使用されます。
@FunctionalInterface
public interface ITest {
void method();
default void method1() {
System.out.println("默认方法");
}
}
ラムダ表現
ラムダ式は関数型インタフェース抽象メソッドの実装を簡潔に表現するために使用され、基本構造は次のとおりです。
(参数列表) -> { 方法体 }
たとえば、スレッドを作成するときにRunnableの実装を直接提供できます。
new Thread(() -> {
System.out.println("执行 run 方法");
}).start();
パラメータの型は通常コンパイラによって推論されます。メソッド本体が1つの文しかない場合は、中括弧を省略できます。唯一の文が戻り式の場合は、returnも省略できます。
Arrays.sort(strings, (s1, s2) -> s1.length() - s2.length());
ラムダ式は簡潔に書かれていますが、関数型インターフェイスオブジェクトが必要な場所に表示する必要があります。
メソッドの参照
メソッド参照は、ラムダ式で記述された操作を実行できるメソッドが存在する場合に使用できます。一般的な形式は以下の通り。
类名::静态方法
类名::实例方法
对象::实例方法
类名::new
メソッド参照の使用は、ターゲット関数インタフェースの抽象メソッド引数と戻り値が参照先メソッドと互換性があるかどうかに依存し、メソッド名は同じである必要はありません。
List<String> list = new ArrayList<>();
Collections.addAll(list, "ab", "cd", "ef");
list.forEach(value -> System.out.println(value));
list.forEach(System.out::println);
list.forEach(Test::upperPrintln);
public class Test {
public static void upperPrintln(String value) {
String result = String.valueOf(value.charAt(0)).toUpperCase()
+ value.substring(1);
System.out.println(result);
}
}
ストリームストリームストリーム
Streamは、データシーケンスのフィルタリング、マッピング、ソート、集計などを実行するために使用されます。データを直接保存せず、通常はコレクションや配列をデータソースとして使用します。
要素の反復
forEach()は、消費ストリーム内の元素のための終端操作です。
List<Integer> list = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
list.stream().forEach(System.out::println);
list.parallelStream().forEach(System.out::println);
並列ストリームの出力順序は必ずしも元の集合と一致しない。
マッピング要素
map()は各要素を別の値に変換し、新しいストリームを生成します。
list.stream()
.map(number -> number * 2)
.forEach(System.out::println);
フィルタリングとインターセプト
filter()は条件に基づいて要素を保持し、limit()は結果の数量を制限します。操作の順序によって、結果が異なる場合があります。
list.stream()
.limit(3)
.filter(number -> number > 2)
.forEach(System.out::println);
list.stream()
.filter(number -> number > 2)
.limit(3)
.forEach(System.out::println);順序と重量
sorted()はソート用、distinct()は重量除去用です。
list.stream()
.sorted()
.distinct()
.forEach(System.out::println);
結果の収集
collect()はストリーム処理結果を新しい集合や文字列に収集することができる.
List<Integer> oddNumbers = list.stream()
.filter(number -> (number & 1) == 1)
.collect(Collectors.toList());
System.out.println(oddNumbers);
List<String> words = Arrays.asList("a", "b", "c");
String result = words.stream()
.collect(Collectors.joining("-"));
System.out.println(result);統計量の推移
count()は、ストリーム内の要素の数を返します
long count = list.stream()
.filter(number -> number > 2)
.count();
System.out.println(count);
気に入ったならばコメントを残してくださいね~