java8升级java17语法一览

这些特性让 Java 代码更简洁、更易读、更安全。

1. 局部变量类型推断 (var) - Java 10

  • 是什么:允许使用 var 声明局部变量,编译器会根据初始化表达式推断其类型。
  • 为什么重要:减少样板代码,让代码更简洁,尤其是在处理泛型或复杂类型时。
  • 示例:
    java复制
    // Java 8
    HashMap<String, List<Integer>> complexMap = new HashMap<String, List<Integer>>();
    
    // Java 10+
    var complexMap = new HashMap<String, List<Integer>>(); // 类型被推断为 HashMap<String, List<Integer>>
    var list = new ArrayList<String>(); // 推断为 ArrayList<String>
    

2. switch 表达式 (Java 12, 14) 和模式匹配 (Java 17 预览)

  • 是什么:switch 从语句升级为表达式,可以返回值,并且使用 -> 箭头语法避免 break。Java 17 引入了 switch 模式匹配的预览。
  • 为什么重要:更简洁,更安全(避免漏写 break),功能更强大。
  • 示例 (switch 表达式):
    java复制
    // Java 8
    String dayType;
    switch (day) {
        case "MON":
        case "TUE":
        case "WED":
        case "THU":
        case "FRI":
            dayType = "Weekday";
            break;
        case "SAT":
        case "SUN":
            dayType = "Weekend";
            break;
        default:
            throw new IllegalArgumentException("Invalid day: " + day);
    }
    
    // Java 14+
    String dayType = switch (day) {
        case "MON", "TUE", "WED", "THU", "FRI" -> "Weekday";
        case "SAT", "SUN" -> "Weekend";
        default -> throw new IllegalArgumentException("Invalid day: " + day);
    };
    

3. 文本块 (Text Blocks) - Java 13, 15

  • 是什么:使用三引号 """ ... """ 来定义多行字符串。
  • 为什么重要:极大改善了 JSON、SQL、HTML、XML 等多行字符串在代码中的可读性和可维护性。
  • 示例:
    java复制
    // Java 8
    String json = "{\n" +
                 "  \"name\": \"Alice\",\n" +
                 "  \"age\": 25\n" +
                 "}";
    
    // Java 15+
    String json = """
                 {
                   "name": "Alice",
                   "age": 25
                 }
                 """;
    

4. Record 类 - Java 16

  • 是什么:一种用于存储不可变数据的简洁的语法,自动生成 constructorgettersequals()hashCode()toString()
  • 为什么重要:彻底简化了值对象(Data Carrier)的创建,减少了大量样板代码,意图更明确。
  • 示例:
    java复制
    // Java 8
    public class Person {
        private final String name;
        private final int age;
        
        public Person(String name, int age) { ... }
        // 还要手动写 getters, equals, hashCode, toString ...
    }
    
    // Java 16+
    public record Person(String name, int age) { }
    // 一切都有了!
    

5. 密封类 (Sealed Classes) - Java 15, 17

  • 是什么:允许一个类或接口明确指定哪些其他类可以继承或实现它。
  • 为什么重要:提供了更强的领域建模能力,在编译时限制类的层次结构,与 switch 表达式结合使用可以实现更完备、更安全的模式匹配。
  • 示例:
    java复制
    // 定义一个密封接口,只允许 Circle 和 Rectangle 实现
    public sealed interface Shape permits Circle, Rectangle { }
    
    // 子类必须是 final, sealed, 或 non-sealed
    public final class Circle implements Shape { ... }
    public final class Rectangle implements Shape { ... }
    
    // 结合 switch 表达式,编译器知道所有可能的情况,无需 default
    double area = switch (shape) {
        case Circle c -> Math.PI * c.radius() * c.radius();
        case Rectangle r -> r.length() * r.width();
    };
    

二、API 增强(新的工具和库)

1. 新的集合工厂方法 - Java 9

  • 是什么:List.of()Set.of()Map.of() 等静态方法,用于创建不可变集合。
  • 为什么重要:创建集合的语法更简洁,并且明确表示集合是不可变的,更安全。
  • 示例:
    java复制
    // Java 8
    List<String> list = Arrays.asList("a", "b", "c"); // 但这个是可变的!
    List<String> immutableList = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
    
    // Java 9+
    List<String> list = List.of("a", "b", "c"); // 真正不可变
    Set<String> set = Set.of("a", "b", "c");
    Map<String, Integer> map = Map.of("a", 1, "b", 2);
    

2. Stream API 增强 - Java 9+

  • Java 9:takeWhiledropWhile 方法,用于根据条件截取流。
  • Java 16:Stream.toList() 方法,比 collect(Collectors.toList()) 更简洁。
  • 示例:
    java复制
    // takeWhile: 遇到第一个不满足条件的元素时停止
    Stream.of(1, 2, 3, 2, 1)
          .takeWhile(n -> n < 3) // 只取 [1, 2]
          .forEach(System.out::println);
    
    // toList
    List<String> result = stream.filter(s -> s.length() > 2).toList();
    

3. HTTP/2 客户端 (HTTP Client) - Java 11

  • 是什么:全新的、支持 HTTP/2 和 WebSocket 的现代 HTTP 客户端 API,取代古老的 HttpURLConnection
  • 为什么重要:性能更好(支持异步),API 更现代化、易用。
  • 示例:
    java复制
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
          .uri(URI.create("https://httpbin.org/json"))
          .build();
    // 同步
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
    
  •  
posted @ 2026-01-08 19:03  ---江北  阅读(3)  评论(0)    收藏  举报
TOP