Jdk1.8新特性

Jdk1.8新特性

引言

在这篇文章介绍一下JDK1.8的一些新特性。

开始

一、语言核心特性

  1. Lambda 表达式

    • 允许以简洁的方式实现函数式接口。

    • 示例:(a, b) -> a + b 替代匿名内部类。

  2. 函数式接口(Functional Interfaces)​

    • 使用 @FunctionalInterface 注解标记,仅含一个抽象方法(如 RunnableComparator)。

    • 常见接口:PredicateConsumerFunctionSupplier

  3. 方法引用(Method References)​

    • 简化 Lambda 表达式,直接引用现有方法。

    • 示例:System.out::println 或 String::toUpperCase

  4. 接口的默认方法与静态方法

    • 默认方法:用 default 关键字定义接口的默认实现,支持接口演化。

    • 静态方法:接口可定义静态工具方法(如 Comparator.comparing())。


​二、集合与 Stream API

  1. Stream API

    • 提供函数式风格的数据处理(如过滤、映射、归约)。

    • 示例:

      java
      list.stream()
         .filter(s -> s.startsWith("A"))
         .map(String::toLowerCase)
         .collect(Collectors.toList());
  2. Optional 类

    • 封装可能为 null 的值,避免空指针异常。

    • 方法:ofNullable()orElse()ifPresent()

三、日期时间 API(JSR 310)​

  • 新包 java.time:线程安全且设计清晰的日期时间类。

    • 核心类:LocalDateLocalTimeLocalDateTimeZonedDateTime

    • 工具类:Duration(时间间隔)、Period(日期间隔)。


​四、JVM 改进

  • 元空间(Metaspace)替代永久代(PermGen)​

  • 元空间使用本地内存,减少 OutOfMemoryError 风险。

示例代码

// Lambda 表达式

List<String> list = Arrays.asList("a", "b", "c");

list.forEach(s -> System.out.println(s));

// Stream API 操作

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);

int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(n -> n).sum();

// Optional 避免空指针

Optional<String> optional = Optional.ofNullable(getName());

String name = optional.orElse("default");

// 新日期 API

LocalDate today = LocalDate.now();

LocalDate nextWeek = today.plusDays(7);

LICENSED UNDER CC BY-NC-SA 4.0