← SEARCHABLE ARCHIVE
Java · 2026-08-03

Java 從基礎到精通 — 第 6 講

使用 Lambda、Stream 和Optional 建立資料流

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

在集合中選擇、轉換和組合滿足條件的值的程式碼經常出現。 Lambda 和 Stream 表達了資料經過操作流程的階段。

拉姆達

Predicate<Monster> isAlive = monster -> monster.getHealth() > 0;
Function<Monster, String> getName = Monster::getName;

Lambda 允許將操作作為值傳遞。 當以相同的函數形式使用現有方法時,方法引用是簡潔的。

流管道

List<String> targetNames = monsters.stream()
    .filter(Monster::isAlive)
    .sorted(Comparator.comparingInt(Monster::getHealth))
    .limit(3)
    .map(Monster::getName)
    .toList();

流程是將活著的怪物依照體力強弱排序,得到三個名字。 中間操作通常在呼叫最終操作時執行。

一旦流被消耗,同一個流就不能再使用。 您必須重複查詢原始集合或將結果儲存為清單。

Optional

Optional<Item> item = repository.find(10);

String name = item
    .map(Item::getName)
    .orElse("Unknown");

可選向返回類型指示該值可能存在也可能不存在。 如果直接呼叫get(),不會再遺失任何處理,因此請使用orElse、map、ifPresent等操作。

可選通常用於表示沒有傳回值,而不是對所有欄位和參數使用它。

效能和可讀性

流並不總是比循環快,並且可能會導致操作對象和結果列表較小。 最好從易於閱讀的流程開始,然後僅將在實際測量中導致問題的重複路徑更改為簡單的循環。

lambda 和流的目的不是使程式碼盡可能短。 目標是使資料處理步驟(例如過濾、轉換和排序)可讀且無副作用。