Java 8 是一个具有里程碑意义的版本,引入了Lambda表达式、Stream API等重要特性,而后续的新版本(如Java 9至Java 21)则在此基础上持续增加了许多新功能和改进。
以下是Java 8与最新版本(以Java 21为例)的一些主要区别及代码示例:
- var关键字(Java 10+)
- Java 10引入了局部变量类型推断
```java
// Java 8
String message = "Hello, World!";
List list = new ArrayList<>();
- Java 10引入了局部变量类型推断
// Java 10+
var message = "Hello, World!"; // 编译器自动推断为String
var list = new ArrayList(); // 编译器自动推断为ArrayList
2. **文本块(Java 15+,正式特性)** ```java // Java 8 String html = "<html>\n" + " <body>\n" + " <p>Hello, World</p>\n" + " </body>\n" + "</html>"; // Java 15+ String html = """ <html> <body> <p>Hello, World</p> </body> </html>"""; - 密封类(Java 17+)
```java
// Java 17+
public sealed class Shape permits Circle, Rectangle, Triangle {
// 类定义
}
public final class Circle extends Shape {
// 类定义
}
4. **记录(Records,Java 16+)** ```java // Java 8 public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } // 需要手动编写getter、equals、hashCode和toString方法 public int getX() { return x; } public int getY() { return y; } // equals, hashCode, toString... } // Java 16+ public record Point(int x, int y) {} // 自动生成所有字段、构造函数、getter、equals、hashCode和toString - switch表达式(Java 12+预览,Java 14正式)
```java
// Java 8
int dayOfWeek;
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
case SATURDAY:dayOfWeek = 1; break;
case SUNDAY:
default:dayOfWeek = 0; break;
}throw new IllegalArgumentException();
// Java 14+
int dayOfWeek = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> 1;
case SATURDAY, SUNDAY -> 0;
default -> throw new IllegalArgumentException();
};
6. **增强的Stream API** ```java // Java 8 List<String> list = Arrays.asList("a", "b", "c"); list.stream() .collect(Collectors.toList()); // Java 16+ List<String> list = Arrays.asList("a", "b", "c"); list.stream() .toList(); // 更简洁的写法,返回不可变列表 - 模式匹配(Java 16+)
```java
// Java 8
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// Java 16+
if (obj instanceof String s) {
System.out.println(s.length()); // 直接使用s,无需显式转换
}
```
这些只是Java 8与新版本之间的一部分区别。随着Java版本的不断更新,还引入了许多其他特性,如模块系统(Java 9)、虚拟线程(Java 21)、向量API等,不断提升Java的性能和开发效率。