JDK 8(Java Development Kit 8)是 Java 历史上一个里程碑式的版本,引入了众多革命性的新特性,极大地改变了 Java 的编程方式,提升了开发效率和代码可读性。以下是其主要新特性的详细介绍:

1. Lambda 表达式(Lambda Expressions)

  • 概念:Lambda 表达式是一种匿名函数,允许将代码块作为参数传递给方法,简化了函数式接口的实现。
  • 语法:(参数列表) -> { 代码块 },例如:
    // 无参数
    () -> System.out.println("Hello Lambda");
    
    // 有参数
    (a, b) -> a + b;
    
  • 作用:减少匿名内部类的冗余代码,使代码更简洁,支持函数式编程风格。
  • 应用场景:配合集合的流式操作(Stream API)、线程创建(Runnable)等。

2. 函数式接口(Functional Interfaces)

  • 概念:只包含一个抽象方法的接口(可包含多个默认方法或静态方法),是 Lambda 表达式的使用基础。
  • 注解:通过@FunctionalInterface注解标识,编译器会检查接口是否符合函数式接口规范。
  • 内置函数式接口:JDK 8 在java.util.function包中提供了大量预定义接口,例如:
    • Predicate<T>:接收 T 类型参数,返回 boolean(用于判断)。
    • Function<T, R>:接收 T 类型参数,返回 R 类型结果(用于转换)。
    • Consumer<T>:接收 T 类型参数,无返回值(用于消费数据)。

3. 流式操作(Stream API)

  • 概念:java.util.stream包提供的一套处理集合的 API,支持链式操作,可实现高效的聚合、过滤、映射等操作。
  • 特点:
    • 基于数据源(集合、数组等),不改变原始数据。
    • 支持串行(stream())和并行(parallelStream())处理,并行流可利用多核 CPU 提升效率。
  • 常用操作:
    List<String> list = Arrays.asList("apple", "banana", "cherry");
    list.stream()
        .filter(s -> s.length() > 5)  // 过滤长度>5的元素
        .map(String::toUpperCase)     // 转换为大写
        .forEach(System.out::println); // 输出结果
    

4. 接口的默认方法和静态方法(Default & Static Methods in Interfaces)

  • 默认方法:接口中用default修饰的方法,允许接口添加新方法而不破坏现有实现类(解决接口演进问题)。
    public interface MyInterface {
        default void defaultMethod() {
            System.out.println("默认方法");
        }
    }
    
  • 静态方法:接口中用static修饰的方法,可直接通过接口名调用,类似工具方法。
    public interface MyInterface {
        static void staticMethod() {
            System.out.println("静态方法");
        }
    }
    

5. 方法引用(Method References)

  • 概念:通过方法名直接引用已有的方法,简化 Lambda 表达式的写法,语法为类名::方法名或对象::方法名。
  • 常见类型:
    • 静态方法引用:Integer::parseInt
    • 实例方法引用:String::length
    • 构造方法引用:ArrayList::new
  • 示例:
    // Lambda表达式
    list.forEach(s -> System.out.println(s));
    
    // 方法引用简化
    list.forEach(System.out::println);
    

6. 新的日期时间 API(Date/Time API)

  • 背景:旧的java.util.Date和Calendar存在线程不安全、API 设计混乱等问题,JDK 8 引入了java.time包,提供了全新的日期时间处理类。
  • 核心类:
    • LocalDate:表示日期(年、月、日),无时间信息。
    • LocalTime:表示时间(时、分、秒),无日期信息。
    • LocalDateTime:同时表示日期和时间。
    • ZonedDateTime:带时区的日期时间。
    • DateTimeFormatter:用于日期时间的格式化和解析(线程安全)。
  • 特点:不可变(线程安全)、API 清晰、支持链式操作。
    LocalDate today = LocalDate.now(); // 获取当前日期
    LocalDate tomorrow = today.plusDays(1); // 计算明天的日期
    String formatted = today.format(DateTimeFormatter.ISO_DATE); // 格式化日期
    

7. Optional 类

  • 概念:java.util.Optional<T>是一个容器类,用于包装可能为null的对象,避免NullPointerException(NPE)。
  • 常用方法:
    • of():创建非空 Optional 对象(若参数为 null 则抛异常)。
    • ofNullable():创建可空的 Optional 对象。
    • isPresent():判断是否有值。
    • orElse():若为空则返回默认值。
    • ifPresent():若有值则执行消费操作。
  • 示例:
    Optional<String> optional = Optional.ofNullable(getName());
    optional.ifPresent(name -> System.out.println("Name: " + name)); // 有值则输出
    String defaultName = optional.orElse("Unknown"); // 为空则返回默认值
    

8. Nashorn JavaScript 引擎

  • 概念:替代了旧的 Rhino 引擎,用于在 JVM 中执行 JavaScript 代码,支持 ECMAScript 5.1 标准,性能更优。
  • 使用:通过javax.script包调用,例如:
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval("print('Hello from Nashorn')");
    

9. 其他特性

  • Base64 支持:java.util.Base64类提供了 Base64 编码和解码的标准实现,替代了第三方库。
  • 并行数组(Parallel Arrays):Arrays类新增了parallelSort()等方法,支持并行排序,提升大数据量排序效率。
  • PermGen 空间移除:将永久代(PermGen)替换为元空间(Metaspace),元空间位于本地内存,默认无大小限制(受系统内存影响),解决了 PermGen 溢出问题。

总结

JDK 8 的新特性以函数式编程为核心(Lambda、Stream、函数式接口),同时优化了接口演进(默认方法)、日期时间处理(新 API)和空值安全(Optional),极大地提升了 Java 的开发效率和代码质量,成为至今仍被广泛使用的版本。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐