首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 8 新特性全景圖:Lambda、Stream、Optional、時間 API、介面預設方法與註解增強

     編輯:Java 綜合教學

Java 8 新特性全景圖:Lambda、Stream、Optional、時間 API、介面預設方法與註解增強

Java 8 是里程碑版本,引入函數式程式設計核心機制,徹底改變代碼風格。本文系統梳理十大核心特性,附完整代碼示例與遷移建議。

環境需求

  • JDK 1.8+
  • Eclipse 需安裝 Java 8 支援插件(或直接升級 IDE)

一、介面預設方法與靜態方法

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() 等預設方法。

二、Lambda 表達式

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

@FunctionalInterface
interface Converter<F, T> { T convert(F from); }

Converter<String, Integer> c = Integer::valueOf; // 方法引用
c.convert("123"); // 123

編譯器檢查介面僅有一個抽象方法,防止誤用。

四、方法引用與建構子引用

類型語法範例
靜態方法Class::methodInteger::valueOf
實例方法obj::methodstr::startsWith
建構子Class::newPerson::new
任意對象實例方法Class::methodString::compareToIgnoreCase

五、Lambda 作用域規則

  • 可存取 final 或「實際上 final」(effectively final)區域變數。
  • 可讀寫實例欄位、靜態變數。
  • 無法存取介面預設方法(需在實現類中調用)。

六、核心內建函數式介面

介面參數返回用途
Predicate<T>Tboolean條件判斷
Function<T, R>TR轉換映射
Supplier<T>無T供給實例
Consumer<T>Tvoid消費處理
Comparator<T>T, Tint比較排序

皆提供豐富預設方法組合(and/or/negate、compose/andThen、reversed 等)。

七、Optional 容器:告別 NullPointerException

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("值不可為空"));

八、Stream API:集合處理的函數式革命

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 增強方法

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));

十、全新時間日期 API (java.time)

類別用途關鍵特性
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(非阻塞異步編排)。
  • Nashorn JS 引擎(已於 JDK 15 移除,建議遷移 GraalVM)。

遷移建議

  1. 集合操作全面改用 Stream + Lambda,代碼更宣告式、可讀性更強。
  2. 拒絕 null,拥抱 Optional。
  3. 時間處理徹底替換為 java.time 套件。
  4. 介面演進優先用 default 方法,保持二進制相容。

Java 8 不只是語法糖,更是程式設計範式的轉折點。掌握其核心抽象,才能寫出現代、高效、可維護的 Java 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved