JDK8新特性
1. Lambda表达式
- Lambda表达式允许以简洁的方式传递行为,它使得Java编程更具函数式编程风格。Lambda表达式的基本语法是
(parameter) -> expression,它为Java提供了匿名方法的替代,常常用于简化集合操作和并行流处理等。
- Lambda表达式仅能用于函数式接口(Functional Interface),即只包含一个抽象方法的接口。
1 2
| List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); list.forEach(name -> System.out.println(name));
|
2. Stream API
- Stream API提供了一种高效且易于使用的方式来处理集合数据。它支持函数式编程风格的操作,如过滤、映射和归约等。Stream的操作支持链式调用,并且可以通过
parallelStream()实现并行处理,提高性能。
1 2 3 4
| List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); long count = names.stream() .filter(name -> name.startsWith("A")) .count();
|
3. Optional类
- Optional类用于防止空指针异常(NullPointerException)。它是一个容器对象,可以包含或不包含非空值。它为值存在与否提供了明确的语义,并提供了一些方法,如
orElse和ifPresent来处理空值问题。
1 2
| Optional<String> optional = Optional.ofNullable("Hello"); optional.ifPresent(value -> System.out.println(value));
|
4. 新的日期时间API
- JDK8引入了全新的日期时间API(
java.time包),它解决了旧版日期时间API的许多问题。新的API提供了不可变的日期时间类,如LocalDate、LocalTime和LocalDateTime,并且支持时区处理和格式化等功能。
1 2
| LocalDate today = LocalDate.now(); LocalDate date = LocalDate.of(2025, 10, 26);
|
5. 默认方法(Default Methods)
- 接口现在可以包含默认方法,这些方法有一个默认的实现。这样,接口的设计者可以在不破坏现有实现的情况下向接口添加新方法。这为接口的演进提供了更大的灵活性。
1 2 3 4 5 6 7 8 9
| interface MyInterface { default void defaultMethod() { System.out.println("This is a default method"); } }
class MyClass implements MyInterface { }
|
6. 函数式接口和@FunctionalInterface注解
- JDK8引入了函数式接口的概念,旨在支持Lambda表达式。函数式接口是只包含一个抽象方法的接口,可以使用
@FunctionalInterface注解来标识,常用于与Lambda表达式结合使用。
1 2 3 4
| @FunctionalInterface interface MyFunctionalInterface { void execute(); }
|
7. 方法引用(Method References)
- 方法引用是Lambda表达式的一种简化形式,它允许直接引用现有的方法或构造函数。方法引用使用
::符号,可以引用静态方法、实例方法或构造函数。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // 使用方法引用打印名字