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的性能和开发效率。