Java 12-17新特性
Java 12新特性
Switch表达式(预览)
java
public class Java12SwitchDemo {
public static void main(String[] args) {
int day = 3;
// 传统switch
String dayName1;
switch (day) {
case 1: dayName1 = "星期一"; break;
case 2: dayName1 = "星期二"; break;
case 3: dayName1 = "星期三"; break;
default: dayName1 = "未知";
}
// Java 12+:switch表达式(预览)
String dayName2 = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4, 5, 6, 7 -> "工作日";
default -> "未知";
};
}
}文件mismatch方法
java
import java.nio.file.Files;
import java.nio.file.Path;
public class FileMismatchDemo {
public static void main(String[] args) throws Exception {
Path file1 = Path.of("file1.txt");
Path file2 = Path.of("file2.txt");
// 比较两个文件,返回第一个不同字节的位置
long mismatch = Files.mismatch(file1, file2);
if (mismatch == -1) {
System.out.println("文件相同");
} else {
System.out.println("文件不同,位置: " + mismatch);
}
}
}CompactNumberFormat
java
import java.text.NumberFormat;
import java.util.Locale;
public class CompactNumberDemo {
public static void main(String[] args) {
NumberFormat formatter = NumberFormat.getCompactNumberInstance(
Locale.CHINA,
NumberFormat.Style.SHORT
);
System.out.println(formatter.format(1000)); // 1千
System.out.println(formatter.format(10000)); // 1万
System.out.println(formatter.format(1000000)); // 100万
NumberFormat longFormatter = NumberFormat.getCompactNumberInstance(
Locale.CHINA,
NumberFormat.Style.LONG
);
System.out.println(longFormatter.format(1000)); // 1千
}
}Java 13新特性
文本块(预览)
java
public class Java13TextBlockDemo {
public static void main(String[] args) {
// 传统方式
String html1 = "<html>\n" +
" <body>\n" +
" <p>Hello</p>\n" +
" </body>\n" +
"</html>";
// Java 13+:文本块(预览)
String html2 = """
<html>
<body>
<p>Hello</p>
</body>
</html>
""";
String json = """
{
"name": "张三",
"age": 25
}
""";
String sql = """
SELECT id, name, age
FROM users
WHERE age > 18
ORDER BY name
""";
}
}Switch表达式增强
java
public class Java13SwitchDemo {
public static void main(String[] args) {
int day = 3;
// Java 13+:yield返回值
String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> {
System.out.println("工作日");
yield "工作日";
}
case 6, 7 -> {
System.out.println("周末");
yield "周末";
}
default -> "未知";
};
}
}Java 14新特性
Records(预览)
java
// Java 14+:Record类(预览)
public record Point(int x, int y) {
// 自动生成构造方法、getter、equals、hashCode、toString
}
public record Person(String name, int age) {
// 可以添加方法
public boolean isAdult() {
return age >= 18;
}
// 可以添加静态方法
public static Person of(String name, int age) {
return new Person(name, age);
}
}
// 使用
Point point = new Point(10, 20);
System.out.println(point.x()); // 10
System.out.println(point.y()); // 20instanceof模式匹配(预览)
java
public class Java14PatternDemo {
public static void main(String[] args) {
Object obj = "Hello";
// 传统方式
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// Java 14+:模式匹配(预览)
if (obj instanceof String s) {
System.out.println(s.length());
}
}
}Switch表达式正式版
java
String dayName = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4, 5 -> "星期四、五";
case 6, 7 -> "周末";
default -> "未知";
};NullPointerException增强
java
public class NPEMessageDemo {
public static void main(String[] args) {
User user = null;
// Java 14+:更详细的NPE信息
// System.out.println(user.getName().length());
// Exception in thread "main" java.lang.NullPointerException:
// Cannot invoke "String.length()" because the return value of
// "User.getName()" is null
}
}
class User {
private String name;
public String getName() { return name; }
}Java 15新特性
文本块正式版
java
String html = """
<html>
<body>
<p>Hello, Java 15!</p>
</body>
</html>
""";
// 转义处理
String json = """
{
"name": "%s",
"age": %d
}
""".formatted("张三", 25);
// 不换行
String text = """
这是一行很长的文本,\
但实际不会换行。\
""";Sealed Classes(预览)
java
// 密封类:限制继承
public sealed class Shape
permits Circle, Rectangle, Triangle {
}
public final class Circle extends Shape {
private double radius;
}
public final class Rectangle extends Shape {
private double width, height;
}
public non-sealed class Triangle extends Shape {
// 可以被其他类继承
}隐藏类
java
// 用于框架和库,动态生成类
// 通过MethodHandles.Lookup.defineHiddenClass创建Java 16新特性
Records正式版
java
public record Student(String name, int age, String school) {
// 紧凑构造方法
public Student {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负");
}
}
}
// Record可以实现接口
public record Point(int x, int y) implements Comparable<Point> {
@Override
public int compareTo(Point other) {
return Integer.compare(x, other.x);
}
}instanceof模式匹配正式版
java
Object obj = "Hello";
if (obj instanceof String s) {
System.out.println("字符串长度: " + s.length());
}
// 与其他条件组合
if (obj instanceof String s && s.length() > 3) {
System.out.println(s.toUpperCase());
}Stream.toList()
java
import java.util.List;
import java.util.stream.Stream;
public class Java16StreamDemo {
public static void main(String[] args) {
// Java 16之前
List<String> list1 = Stream.of("A", "B", "C")
.collect(Collectors.toList());
// Java 16+
List<String> list2 = Stream.of("A", "B", "C")
.toList(); // 返回不可变列表
}
}Vector API(孵化)
java
import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorSpecies;
public class VectorDemo {
static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;
void vectorComputation(float[] a, float[] b, float[] c) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
var va = FloatVector.fromArray(SPECIES, a, i);
var vb = FloatVector.fromArray(SPECIES, b, i);
var vc = va.mul(va).add(vb.mul(vb)).neg();
vc.intoArray(c, i);
}
}
}Java 17新特性(LTS)
Sealed Classes正式版
java
public sealed interface Shape permits Circle, Rectangle {
double area();
}
public final class Circle implements Shape {
private final double radius;
public Circle(double radius) { this.radius = radius; }
@Override
public double area() { return Math.PI * radius * radius; }
}
public final class Rectangle implements Shape {
private final double width, height;
public Rectangle(double w, double h) { width = w; height = h; }
@Override
public double area() { return width * height; }
}
// 模式匹配
double area = switch (shape) {
case Circle c -> c.area();
case Rectangle r -> r.area();
};增强的伪随机数生成器
java
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;
public class RandomDemo {
public static void main(String[] args) {
// 创建随机数生成器
RandomGenerator random = RandomGenerator.getDefault();
// 指定算法
RandomGenerator xoroshiro = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create();
// 生成随机数
System.out.println(random.nextInt(100));
System.out.println(random.nextDouble());
// 流式生成
random.ints(10, 0, 100).forEach(System.out::println);
}
}Java 12-17特性总结
| 版本 | 重要特性 |
|---|---|
| Java 12 | Switch表达式预览、文件mismatch |
| Java 13 | 文本块预览、Switch增强 |
| Java 14 | Records预览、instanceof模式匹配预览、Switch正式版 |
| Java 15 | 文本块正式版、Sealed Classes预览 |
| Java 16 | Records正式版、instanceof模式匹配正式版、Stream.toList() |
| Java 17 LTS | Sealed Classes正式版、增强随机数生成器 |