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

Java 8 十大新特性完整指南:Lambda、Stream、Optional、新時間 API 等核心變革

     編輯:Java 綜合教學

背景

Java 8 (2014.3) 是 Java 5 以來最大版本升級,Java 9 (2017.9) 即將發布,趁此機會系統梳理 8 大核心特性與 7 個補充增強,助力遷移與面試。

核心十大特性

1. Lambda 表達式 —— 函數式編程入口

// 語法:(參數) -> { 方法體 }
Arrays.asList("p","k","u","f","o","r","k").forEach(e -> System.out.println(e));
// 函數式接口:僅含一個抽象方法的接口
@FunctionalInterface
interface Calculator { int calc(int a, int b); }
Calculator add = (a, b) -> a + b;

配合 @FunctionalInterface 編譯期校驗,避免誤添加多個抽象方法。

2. 接口默認方法 & 靜態方法

interface Greeting {
    default void sayHello() { System.out.println("Hello"); } // 實現類可選覆寫
    static void sayBye() { System.out.println("Bye"); }      // 接口級工具方法
}

解決接口演進兼容性難題,減少抽象類層級。

3. 方法引用 ::

類型語法示例
構造器引用Class::newUser::new
靜態方法引用Class::staticMethodMath::max
任意對象實例方法Class::instanceMethodString::toUpperCase
特定對象實例方法instance::methodSystem.out::println

4. 重複註解 @Repeatable

@Repeatable(Schedules.class)
@interface Schedule { String day(); }
@interface Schedules { Schedule[] value(); }

@Schedule(day="Mon") @Schedule(day="Wed") // 同一位置多次使用
class MyService {}

5. 註解擴展:類型註解

可標註於泛型、類型轉換、implements、throws 等類型上下文:

List<@NonNull String> list;
(@NonNull String) obj;
class A implements @Readonly Serializable {}
void m() throws @Critical Exception {}

6. Optional 容器 —— 拒絕 NPE

Optional opt = Optional.ofNullable(getName());
opt.ifPresent(System.out::println);
String name = opt.orElse("Default");
opt.ifPresentOrElse(v -> log(v), () -> log("empty"));

強制調用方處理缺失情況,消除防禦性 if (x != null)。

7. Stream API —— 集合處理的範式革命

List result = list.stream()
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase)
    .sorted()
    .collect(Collectors.toList());
// 並行流:.parallelStream() 自動利用多核

支持鏈式、管道式、聲明式數據處理,內部迭代替代外部迭代。

8. 全新 Date/Time API (JSR 310)

類用途
LocalDate無時區日期 (2023-10-01)
LocalTime無時區時間 (13:45:30)
LocalDateTime無時區日期時間
ZonedDateTime帶時區日期時間
Duration / Period時間間隔 / 日期間隔
DateTimeFormatter線程安全格式化/解析

不可變、線程安全、領域模型清晰,徹底替代 java.util.Date/Calendar。

9. Nashorn JS 引擎

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hello from JS');");
// Java 調用 JS 函數、JS 調用 Java 方法雙向互通

JVM 上運行 JS,替代 Rhino,性能大幅提升。

10. Base64 入標準庫

Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
String encoded = encoder.encodeToString("data".getBytes());
byte[] decoded = decoder.decode(encoded);
// URL/MIME 安全變體:Base64.getUrlEncoder()

七大補充增強

  1. 類型推斷增強:鑽石操作符 `<>` 擴展至構造器、Lambda 參數,減少冗餘類型聲明。
  2. 編譯器參數名保留:javac -parameters 將參數名寫入字節碼,反射可獲取 Parameter.getName()。
  3. 並行數組操作:Arrays.parallelSort()、parallelSetAll()、parallelPrefix() 利用 ForkJoinPool 多核加速。
  4. 並發增強:CompletableFuture、LongAdder/DoubleAdder、StampedLock、ConcurrentHashMap 新增聚合操作。
  5. jjs 命令行工具:直接運行 JS 文件或 REPL 交互。
  6. jdeps 類依賴分析器:jdeps -cp . MyClass.class 輸出包/類級依賴圖。
  7. PermGen → Metaspace:元空間使用本地內存,移除 -XX:MaxPermSize,新增 -XX:MaxMetaspaceSize。

遷移建議

  • 新項目直接使用 Java 8+ 語法,舊項目優先引入 Stream/Optional/Lambda 重構核心邏輯。
  • 日期時間代碼全量遷移至 java.time,避免舊 API 線程安全坑。
  • 關注 -parameters 對框架(Spring/MyBatis)反射性能的提升。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved