Java - Stream API 改進

Hello, 未來的 Java 開發者們!很高興你們來到這裡。今天,我們將要深入一個令人興奮的議題:Java 中的 Stream API 改進。如果你是編程新手,不用擔心;我會逐步引導你理解每個概念,就像我這些年來對無數學生所做的一樣。所以,拿起你喜歡的飲料,放鬆一下,我們一起踏上這段 Java 旅程吧!

Java - Stream API Improvements

Stream API 是什麼?

在我們深入改進之前,讓我們從基礎開始。Stream API 是在 Java 8 中引入的,就像一條神奇的傳送帶,讓你可以以聲明式方法處理對象集合。想像你有一盒五彩繽紛的彈珠,你想將它們排序、計數或只選出藍色的。Stream API 能夠幫你高效且優雅地完成所有這些工作。

Stream API 改進

Java,就像一個勤奮的學生,總是在學習和進步。随着最近的更新,Stream API 變得更好了!讓我們一一探索這些增強功能。

takeWhile(Predicate 接口) 方法

takeWhile 方法就像一個專屬俱樂部的門衛,但它不是檢查身份證,而是檢查你指定的條件。只要元素滿足這個條件,它就會從 stream 中取出元素。

讓我們看看它是如何工作的:

List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
List<String> result = fruits.stream()
.takeWhile(fruit -> fruit.length() <= 5)
.collect(Collectors.toList());
System.out.println(result);

輸出:

[apple]

在這個例子中,takeWhile 就像一個水果采摘者,一旦遇到一個字母超過5個的水果就停止。它會選擇 "apple",但在遇到 "banana"(因為它太長)時停止。

dropWhile(Predicate 接口)

如果 takeWhile 是讓人進入的門衛,那麼 dropWhile 就是讓人保持在外的門衛...直到某個點。只要元素滿足條件,它就會丟棄元素,然後保留其餘的。

這是它如何工作的:

List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 9, 10, 12);
List<Integer> result = numbers.stream()
.dropWhile(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(result);

輸出:

[9, 10, 12]

在這個例子中,dropWhile 就像一個害怕偶數的人。他會一直丟棄偶數,直到遇到9(一個奇數),然後保留之後的所有數字,即使是偶數也一樣!

iterate 方法

iterate 方法就像一個故事發生器。你給它一個起始點,一種檢查故事是否應繼續的方法,以及一種創造下一章的方法。

這是一個例子:

Stream<Integer> numbers = Stream.iterate(1, n -> n < 100, n -> n * 2);
numbers.forEach(System.out::println);

輸出:

1
2
4
8
16
32
64

在這個故事中,我們從1開始,只要數字小於100就繼續,每個新數字是前一个的兩倍。這就像棋盤和米粒的傳奇一樣!

ofNullable

ofNullable 就像一個細心的包裹處理員。它創建一個最多包含一個元素的 stream,並確保優雅地處理 null 值。

讓我們看看它是如何工作的:

String name = null;
Stream<String> stream = Stream.ofNullable(name);
System.out.println(stream.count());

name = "Alice";
stream = Stream.ofNullable(name);
System.out.println(stream.count());

輸出:

0
1

name 為 null 時,ofNullable 創建一個空 stream。當 name 有值時,它創建一個包含那個值的 stream。這就像一個魔術師,他能根據是否存在來讓東西出現或消失!

結合所有知識

現在我們已經學會了這些新的工具,讓我們在Java工具箱中用一個例子來使用它們:

List<String> words = Arrays.asList("The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog");

List<String> result = words.stream()
.dropWhile(word -> word.length() <= 3)
.takeWhile(word -> !word.equals("over"))
.flatMap(word -> Stream.ofNullable(word.toLowerCase()))
.collect(Collectors.toList());

System.out.println(result);

輸出:

[quick, brown, fox, jumps]

在這個例子中,我們正在處理一個單詞列表:

  1. 我們丟棄長度小於或等於3個字母的單詞 (dropWhile)
  2. 我們選擇直到遇到 "over" 的單詞 (takeWhile)
  3. 我們將每個單詞轉換為小寫,並處理可能的 null 值 (flatMapofNullable)
  4. 最後,我們將結果收集到一個新列表中

這就像我們正在創造一個經過精炼的 "quick brown fox" 句子的新版本!

結論

親愛的學生們,這就是你所學到的 Java Stream API 的令人興奮的新改進。這些工具使處理 streams 變得更加靈活和強大。記住,像學習任何新技能一樣,掌握這些概念需要練習。所以不要害怕在自 己的代碼中試驗和玩耍這些方法。

當我們結束時,我總是會對我的學生們分享一句話:"在編程中,就像在生活中一樣,知識的溪流從不斷流。持續學習,持續編程,最重要的是,樂在其中!"

下次見,快樂編程!

Credits: Image by storyset