前言

JDK 8(Java Development Kit 8)引入了许多新的特性和改进,使得Java语言更加现代化和易于使用。以下是JDK 8的一些主要新特性:

Lambda表达式

允许把函数作为参数传递给方法,简化代码编写,提高代码的可读性和可维护性。

1
2
3
4
5
6
7
8
9
10
11
// 传统写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello, world!");
}
}).start();

// Lambda表达式
new Thread(() -> System.out.println("Hello, world!")).start();

函数式接口

只包含一个抽象方法的接口,称为函数式接口。可以用Lambda表达式来实现函数式接口。

例如,java.util.function包中的接口(如Function, Predicate, Consumer等)。

方法引用

允许直接引用现有的方法或构造函数,使代码更加简洁。

1
2
3
4
5
// 使用Lambda表达式
list.forEach(s -> System.out.println(s));

// 使用方法引用
list.forEach(System.out::println);

默认方法

接口中可以包含带有默认实现的方法。允许在不破坏现有实现的情况下为接口添加新方法。

1
2
3
4
5
interface MyInterface {
default void defaultMethod() {
System.out.println("Default method");
}
}

新日期和时间API

引入了java.time包,提供了更现代和强大的日期和时间处理功能,替代原有的java.util.Datejava.util.Calendar

1
2
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);

Stream API

用于处理集合类(如List,Set等)的新工具,提供了高效的批量数据操作能力。

  • stream().filter()是Java8引入的一个功能,用于对数据源进行过滤,生成一个新的数据流。
  • stream()是一个函数式接口,用于从数据源(如集合、数组等)生成一个流。
  • filter()是Stream接口中的一个方法,它接受一个Predicate函数作为参数,对原有流中的元素进行过滤,生成一个新的流,其中包含符合Predicate条件的元素
  • filter()方法支持多条件过滤。多个条件过滤数据,可以通过逻辑运算符(如:&&||)将多个条件连接起来,确保所有条件都满足时才将元素包含在新生成的数据流中。

公式

1
2
3
list.stream()
.filter(esd -> 判断条件)
.forEach(esd -> 执行操作);

示例:
1
2
3
4
List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream()
.filter(s -> s.startsWith("a"))
.forEach(System.out::println);

Optional类

用于防止NullPointerException,并提供了优雅的方式来处理可能为null的值。

1
2
Optional<String> optional = Optional.of("hello");
optional.ifPresent(System.out::println);

Nashorn JavaScript引擎

新的JavaScript引擎,允许在Java应用程序中嵌入和执行JavaScript代码。

1
2
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hello, Nashorn');");

并行数组(Parallel Array)

java.util.Arrays类中增加了一些方法,可以利用多核处理器来并行操作数组。

1
Arrays.parallelSort(array);

注解的新特性

支持在类型上使用注解,并允许重复注解。

1
2
3
4
5
@Repeatable(Schedules.class)
public @interface Schedule {
String dayOfMonth();
String time();
}