Skip to content

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());  // 20

instanceof模式匹配(预览)

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 12Switch表达式预览、文件mismatch
Java 13文本块预览、Switch增强
Java 14Records预览、instanceof模式匹配预览、Switch正式版
Java 15文本块正式版、Sealed Classes预览
Java 16Records正式版、instanceof模式匹配正式版、Stream.toList()
Java 17 LTSSealed Classes正式版、增强随机数生成器