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)); // 使用Lambda表达式简化代码

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(); // 计算以"A"开头的名字数量

3. Optional类

  • Optional类用于防止空指针异常(NullPointerException)。它是一个容器对象,可以包含或不包含非空值。它为值存在与否提供了明确的语义,并提供了一些方法,如orElseifPresent来处理空值问题。
1
2
Optional<String> optional = Optional.ofNullable("Hello");
optional.ifPresent(value -> System.out.println(value)); // 如果值存在则打印

4. 新的日期时间API

  • JDK8引入了全新的日期时间API(java.time包),它解决了旧版日期时间API的许多问题。新的API提供了不可变的日期时间类,如LocalDateLocalTimeLocalDateTime,并且支持时区处理和格式化等功能。
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 {
// 无需实现defaultMethod方法
}

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);  // 使用方法引用打印名字