JavaRush /Java Blog /Random-TW /別再寫循環了!使用 Java 8 集合的 10 種最佳方法

別再寫循環了!使用 Java 8 集合的 10 種最佳方法

在 Random-TW 群組發布
我認為沒有必要向JavaRush的學生解釋什麼是集合以及它們的用途。不過,第 8 版發布後,許多原本需要 6-7 行程式碼的基本操作被簡化到了最少。言歸正傳,這裡列出了 10 種最佳 Java8 集合框架技術,它們將為您節省大量時間和空間! 別再寫循環了! Java 8 中處理集合的 10 種最佳方法 - 1大家好,朋友們!如你所知,習慣是第二天性。而且已經習慣了寫作,for (int i = 0; i <......)我根本不想重新學習它(特別是因為這個設計非常簡單易懂)。然而,在循環內部,我們經常重複相同的基本操作,而我們確實希望消除這些重複。隨著 Java8 的發布,Oracle 決定幫助我們解決這個問題。以下是 10 種最佳收集方法,可為您節省大量時間和程式碼。

1. Iterable.forEach(Consumer<? super T> 操作)

名字足以說明問題。迭代傳遞的集合並action為每個元素執行 lambda 表達式。
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 + " "));
在一行中,我們從清單中刪除所有大於 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(物件鍵, V defaultValue)

傳回與 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 key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

我什至沒有嘗試計算此方法將為您節省多少行程式碼。
  • 如果您的密鑰中不存在Map該密鑰,或者該密鑰相等,則該方法會新增。keyvaluenullMapkey-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