JDK8 有哪些新特性?
·
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 的开发效率和代码质量,成为至今仍被广泛使用的版本。
更多推荐



所有评论(0)