Java 8 (2014.3) 是 Java 5 以來最大版本升級,Java 9 (2017.9) 即將發布,趁此機會系統梳理 8 大核心特性與 7 個補充增強,助力遷移與面試。
// 語法:(參數) -> { 方法體 }
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 編譯期校驗,避免誤添加多個抽象方法。
interface Greeting {
default void sayHello() { System.out.println("Hello"); } // 實現類可選覆寫
static void sayBye() { System.out.println("Bye"); } // 接口級工具方法
}
解決接口演進兼容性難題,減少抽象類層級。
| 類型 | 語法 | 示例 |
|---|---|---|
| 構造器引用 | Class::new | User::new |
| 靜態方法引用 | Class::staticMethod | Math::max |
| 任意對象實例方法 | Class::instanceMethod | String::toUpperCase |
| 特定對象實例方法 | instance::method | System.out::println |
@Repeatable(Schedules.class)
@interface Schedule { String day(); }
@interface Schedules { Schedule[] value(); }
@Schedule(day="Mon") @Schedule(day="Wed") // 同一位置多次使用
class MyService {}
可標註於泛型、類型轉換、implements、throws 等類型上下文:
List<@NonNull String> list;
(@NonNull String) obj;
class A implements @Readonly Serializable {}
void m() throws @Critical Exception {}
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)。
List result = list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
// 並行流:.parallelStream() 自動利用多核
支持鏈式、管道式、聲明式數據處理,內部迭代替代外部迭代。
| 類 | 用途 |
|---|---|
| LocalDate | 無時區日期 (2023-10-01) |
| LocalTime | 無時區時間 (13:45:30) |
| LocalDateTime | 無時區日期時間 |
| ZonedDateTime | 帶時區日期時間 |
| Duration / Period | 時間間隔 / 日期間隔 |
| DateTimeFormatter | 線程安全格式化/解析 |
不可變、線程安全、領域模型清晰,徹底替代 java.util.Date/Calendar。
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hello from JS');");
// Java 調用 JS 函數、JS 調用 Java 方法雙向互通
JVM 上運行 JS,替代 Rhino,性能大幅提升。
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()
javac -parameters 將參數名寫入字節碼,反射可獲取 Parameter.getName()。Arrays.parallelSort()、parallelSetAll()、parallelPrefix() 利用 ForkJoinPool 多核加速。CompletableFuture、LongAdder/DoubleAdder、StampedLock、ConcurrentHashMap 新增聚合操作。jdeps -cp . MyClass.class 輸出包/類級依賴圖。-XX:MaxPermSize,新增 -XX:MaxMetaspaceSize。java.time,避免舊 API 線程安全坑。-parameters 對框架(Spring/MyBatis)反射性能的提升。