Java 8 是里程碑版本,引入函數式程式設計核心機制,徹底改變代碼風格。本文系統梳理十大核心特性,附完整代碼示例與遷移建議。
interface Formula {
double calculate(int a);
default double sqrt(int a) { return Math.sqrt(a); } // 預設實現
static double pi() { return 3.14159; } // 靜態方法
}
// 實現類僅需實現抽象方法
Formula f = a -> sqrt(a * 100);
f.calculate(100); // 100.0
f.sqrt(16); // 4.0
Formula.pi(); // 3.14159
意義: 介面可演進而不破壞現有實現,集合框架大量新增 stream()、forEach() 等預設方法。
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
// 匿名內部類寫法
Collections.sort(names, new Comparator<String>() {
public int compare(String a, String b) { return b.compareTo(a); }
});
// Lambda 逐步簡化
Collections.sort(names, (String a, String b) -> b.compareTo(a));
Collections.sort(names, (a, b) -> b.compareTo(a)); // 類型推導
本質: 函數式介面(單一抽象方法)的實例化語法糖。
@FunctionalInterface
interface Converter<F, T> { T convert(F from); }
Converter<String, Integer> c = Integer::valueOf; // 方法引用
c.convert("123"); // 123
編譯器檢查介面僅有一個抽象方法,防止誤用。
| 類型 | 語法 | 範例 |
|---|---|---|
| 靜態方法 | Class::method | Integer::valueOf |
| 實例方法 | obj::method | str::startsWith |
| 建構子 | Class::new | Person::new |
| 任意對象實例方法 | Class::method | String::compareToIgnoreCase |
final 或「實際上 final」(effectively final)區域變數。| 介面 | 參數 | 返回 | 用途 |
|---|---|---|---|
| Predicate<T> | T | boolean | 條件判斷 |
| Function<T, R> | T | R | 轉換映射 |
| Supplier<T> | 無 | T | 供給實例 |
| Consumer<T> | T | void | 消費處理 |
| Comparator<T> | T, T | int | 比較排序 |
皆提供豐富預設方法組合(and/or/negate、compose/andThen、reversed 等)。
Optional<String> opt = Optional.of("bam");
opt.isPresent(); // true
opt.get(); // "bam"
opt.orElse("fallback"); // "bam"
opt.ifPresent(s -> System.out.println(s.charAt(0))); // "b"
// 安全鏈式調用
Optional.ofNullable(map.get(key))
.map(String::trim)
.filter(s -> !s.isEmpty())
.orElseThrow(() -> new IllegalArgumentException("值不可為空"));
List<String> list = Arrays.asList("ddd2", "aaa2", "bbb1", "aaa1", "bbb3", "ccc", "bbb2", "ddd1");
list.stream()
.filter(s -> s.startsWith("a"))
.sorted()
.map(String::toUpperCase)
.forEach(System.out::println);
// AAA1
// AAA2
操作分類: 中間操作(返回 Stream,如 filter/map/sorted)與 終端操作(產生結果,如 forEach/collect/reduce/count)。
並行流: parallelStream() 多執行緒處理,百萬級資料排序效能提升 50%+。
Map<Integer, String> map = new HashMap<>(); map.putIfAbsent(1, "val1"); map.computeIfPresent(1, (k, v) -> v + k); // val11 map.computeIfAbsent(2, k -> "val" + k); // val2 map.merge(3, "val3", (old, n) -> old + n); // 合並邏輯 map.forEach((k, v) -> System.out.println(k + "=" + v));
| 類別 | 用途 | 關鍵特性 |
|---|---|---|
| Instant | 時間戳 | 納秒精度、時區無關、可轉 Date |
| LocalDate | 日期 | 不可變、plus/minus、格式化 |
| LocalTime | 時間 | 無日期、時區無關 |
| LocalDateTime | 日期時間 | 組合前兩者 |
| ZonedDateTime | 帶時區日期時間 | 處理夏令時、跨時區 |
| DateTimeFormatter | 格式化/解析 | 線程安全、預定義/自定格式 |
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant(); // 轉 Instant
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime.parse("2024-01-01 12:00", fmt);
@Repeatable(Hints.class)
@interface Hint { String value(); }
@interface Hints { Hint[] value(); }
@Hint("h1")
@Hint("h2")
class Person {}
// 反射獲取
Hint[] hints = Person.class.getAnnotationsByType(Hint.class); // 直接獲取所有 @Hint
新增 ElementType.TYPE_PARAMETER、TYPE_USE 目標,支援泛型參數與類型使用位置標註。
Arrays.parallelSort、StampedLock(樂觀讀鎖)、CompletableFuture(非阻塞異步編排)。null,拥抱 Optional。java.time 套件。default 方法,保持二進制相容。Java 8 不只是語法糖,更是程式設計範式的轉折點。掌握其核心抽象,才能寫出現代、高效、可維護的 Java 代碼。