Java 8 是 Java 语言的一个重要版本,于 2014 年发布。它引入了许多新特性和改进,极大地提升了语言的表达能力和开发效率。以下是 Java 8 的一些主要新特性:


1. Lambda 表达式

  • 概述:Lambda 表达式允许以更简洁的方式编写匿名函数,支持函数式编程风格。
  • 语法

    (参数列表) -> { 表达式或代码块 }
  • 示例

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    names.forEach(name -> System.out.println(name));
  • 作用:简化代码,提升可读性,支持函数式接口(如 RunnableComparator 等)。

2. 函数式接口(Functional Interfaces)

  • 概述:函数式接口是只包含一个抽象方法的接口,可以使用 Lambda 表达式实现。
  • 示例

    @FunctionalInterface
    interface MyFunction {
        void doSomething(String input);
    }
  • 内置函数式接口

    • java.util.function 包中提供了常用的函数式接口,如:

      • Predicate<T>:接收一个参数,返回布尔值。
      • Consumer<T>:接收一个参数,无返回值。
      • Function<T, R>:接收一个参数,返回一个结果。
      • Supplier<T>:不接收参数,返回一个结果。

3. Stream API

  • 概述:Stream API 提供了一种高效且易于使用的方式来处理集合数据。
  • 特点

    • 支持链式操作(如过滤、映射、排序等)。
    • 支持并行处理,提升性能。
  • 示例

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> evenNumbers = numbers.stream()
        .filter(n -> n % 2 == 0)
        .collect(Collectors.toList());
  • 常用操作

    • filter:过滤元素。
    • map:转换元素。
    • reduce:聚合操作。
    • collect:将结果收集到集合中。

4. 接口的默认方法(Default Methods)

  • 概述:允许在接口中定义带有默认实现的方法,避免破坏现有实现类。
  • 语法

    interface MyInterface {
        default void doSomething() {
            System.out.println("Default implementation");
        }
    }
  • 作用

    • 支持接口的向后兼容性。
    • 允许接口提供默认行为,减少抽象类的使用。

5. 接口的静态方法(Static Methods)

  • 概述:允许在接口中定义静态方法,提供工具方法。
  • 示例

    interface MyInterface {
        static void printMessage() {
            System.out.println("Static method in interface");
        }
    }

6. Optional 类

  • 概述Optional<T> 是一个容器类,用于避免 null 值的潜在问题。
  • 示例

    Optional<String> optional = Optional.ofNullable(null);
    System.out.println(optional.orElse("Default value"));
  • 常用方法

    • of:创建包含非空值的 Optional
    • ofNullable:创建包含可能为空值的 Optional
    • orElse:如果值为空,返回默认值。
    • isPresent:检查值是否存在。

7. 新的日期和时间 API(Date and Time API)

  • 概述:新的日期和时间 API 位于 java.time 包中,解决了旧的 DateCalendar 类的许多问题。
  • 主要类

    • LocalDate:表示日期(如 2024-10-01)。
    • LocalTime:表示时间(如 15:30:00)。
    • LocalDateTime:表示日期和时间。
    • ZonedDateTime:表示带时区的日期和时间。
  • 示例

    LocalDate today = LocalDate.now();
    LocalTime now = LocalTime.now();
    System.out.println("Today: " + today);
    System.out.println("Now: " + now);

8. 方法引用(Method References)

  • 概述:方法引用是 Lambda 表达式的简化形式,用于引用已有的方法。
  • 语法

    • 类名::静态方法
    • 对象名::实例方法
    • 类名::实例方法
    • 类名::new(构造方法引用)
  • 示例

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    names.forEach(System.out::println);