JavaRush /Java Blog /Random-JA /サイクルを書くのはやめてください! Java 8 のコレクションを操作するための最良の方法トップ 10

サイクルを書くのはやめてください! Java 8 のコレクションを操作するための最良の方法トップ 10

Random-JA グループに公開済み
JavaRush の学生にコレクションとは何か、そしてその目的を説明する必要はないと思います。ただし、第 8 バージョンのリリース後、以前は 6 ~ 7 行のコードが必要だった多くの基本的な操作が最小限に簡素化されました。さっそく、時間とスペースを大幅に節約する Java8 Collections Framework のベスト 10 テクニックを紹介します。 サイクルを書くのはやめてください!  Java 8 のコレクションを操作するためのベスト 10 のメソッド - 1みなさん、こんにちは!ご存知のとおり、習慣は第二の天性です。そして、書くことに慣れてしまったので、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メソッドは追加します。Mapkey-value
  • キーがKey存在し、実際に存在する場合、value != nullメソッドはそれを、value渡された関数の実行結果に変更しますremappingFunction
  • remappingFunctionを返した場合nullkeyコレクションから削除されます。
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が の場合に限りますoldValueMap.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 新しいものに慣れるのはいつも難しいですが、これらの変化は本当に良いことです。いずれにせよ、私のコードのいくつかの部分は、以前よりも明らかにスパゲッティ的ではなくなりました :) この記事が気に入って、新しい記事を見たい場合は、「いいね」をクリックして、コンテストで著者をサポートすることを忘れないでください。さらに良いのは、「いいね!」です :) 勉強頑張ってください!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION