JavaRush の学生にコレクションとは何か、そしてその目的を説明する必要はないと思います。ただし、第 8 バージョンのリリース後、以前は 6 ~ 7 行のコードが必要だった多くの基本的な操作が最小限に簡素化されました。さっそく、時間とスペースを大幅に節約する Java8 Collections Framework のベスト 10 テクニックを紹介します。 みなさん、こんにちは!ご存知のとおり、習慣は第二の天性です。そして、書くことに慣れてしまったので、
for (int i = 0; i <......)
まったく勉強し直す気はありません (特にこのデザインは非常にシンプルでわかりやすいため)。ただし、ループ内では同じ基本的な操作を繰り返すことがよくあり、その繰り返しは本当に排除したいと考えています。Java8 のリリースに伴い、Oracle はこれに関して私たちを支援することを決定しました。以下は、時間とコードを大幅に節約する 10 の最良の収集方法です。
1. Iterable.forEach(Consumer<? super T> アクション)
名前自体がそれを物語っています。渡されたコレクションを反復処理し、要素ごとにラムダ式を実行しますaction
。
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7
2. Collection.removeIf(Predicate<? super E> フィルター)
何も複雑なことはありません。このメソッドはコレクションを反復処理し、一致する要素を削除しますfilter
。
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
numbers.forEach(s -> System.out.print(s + " "));
1 行で、5 より大きいすべての数値をリストから削除します。
3. Map.forEach(BiConsumer<? super K, ? super V> アクション)
このメソッドは、forEach
インターフェイスを実装するクラスだけでなくCollection
、 に対しても機能しますMap
。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
4. Map.compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)
少し恐ろしく見えますが、実際にはこれまでのものと同様にシンプルです。このメソッドは、指定されたキーのkey
値を関数の結果に設定しますremappingFunction
。例えば:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
『 Java哲学』 の著者間違いなくクールです! :)
5. Map.computeIfAbsent(K key, Function<? super K, ? extends V> MappingFunction)
このメソッドは、同じキーを持つ要素が存在しない場合にのみ、新しい要素をMapに追加します。関数の実行結果がvalue
割り当てられますmappingFunction
。そのようなキーを持つ要素がすでに存在する場合、その要素は上書きされず、所定の位置に残ります。本に戻って新しい方法を試してみましょう。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
私たちの役割mappingFunction
:
public static String getHarryPotterAuthor() {
return "Джоан Роулинг";
}
そして、新しい本は次のとおりです。
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин
6. Map.computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
と同じ原理ですが、Map.compute()
キーを持つ要素がkey
すでに存在する場合にのみすべての計算が実行されます。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Map
私たちの本には「エフゲニー・オネーギン」というタイトルの本がない ので、この関数が初めて呼び出されたときは何も変化しませんでした。しかし、番組は二度目に『カラマーゾフの兄弟』の著者を「アレクサンドル・プーシキン」に変更した。結論:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
7. Map.getOrDefault(オブジェクトキー, VdefaultValue)
key に対応する値を返しますkey
。そのようなキーが存在しない場合は、デフォルト値を返します。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
とても快適です:
Неизвестный автор
8. Map.merge(K キー, V 値, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
この方法でコードの行数が何行削減されるか計算しようともしませんでした。Map
キーが自分のキーにkey
存在しない場合、またはvalue
このキーが等しい場合、null
メソッドは追加します。Map
key-value
- キーが
Key
存在し、実際に存在する場合、value != null
メソッドはそれを、value
渡された関数の実行結果に変更しますremappingFunction
。 remappingFunction
を返した場合null
、key
コレクションから削除されます。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.merge("Философия Java", "Брюс Эккель", (a, b) -> b + " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
結論:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*ごめんなさい、ブルース*
9. Map.putIfAbsent(K キー, V 値)
Map
以前は、ペアが存在しない場合 にペアを追加するには、次の手順を実行する必要がありました。
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
map.put("Властелин Колец", "Джон Толкин");
すべてがはるかにシンプルになりました。
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");
10. Map.replace と Map.replaceAll()
リストの最後ですが、重要ではありません。 —そのようなキーが存在する場合、Map.replace(K key, V newValue
キー値key
を に置き換えます。newValue
そうでない場合は、何も起こりません。 Map.replace(K key, V oldValue, V newValue)
- 同じことを行いますが、現在の値key
が の場合に限りますoldValue
。 Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
— すべての値をvalue
関数の実行結果に置き換えますfunction
。例えば:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
動作しませんでした!カラマーゾフの兄弟の鍵の現在の価値はブルース・エッケルではなくフョードル・ドストエフスキーであるため、何も変わりません。
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
public static String getCoolWriter() {
return "Крутой писатель";
}
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
複雑な構築をすることなく、マップ全体の値を簡単に変更できます。PS 新しいものに慣れるのはいつも難しいですが、これらの変化は本当に良いことです。いずれにせよ、私のコードのいくつかの部分は、以前よりも明らかにスパゲッティ的ではなくなりました :) この記事が気に入って、新しい記事を見たい場合は、「いいね」をクリックして、コンテストで著者をサポートすることを忘れないでください。さらに良いのは、「いいね!」です :) 勉強頑張ってください!
GO TO FULL VERSION