java8升级java17语法一览
这些特性让 Java 代码更简洁、更易读、更安全。
1. 局部变量类型推断 (var) - Java 10
- 是什么:允许使用
var声明局部变量,编译器会根据初始化表达式推断其类型。 - 为什么重要:减少样板代码,让代码更简洁,尤其是在处理泛型或复杂类型时。
- 示例:
// 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 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 8 String json = "{\n" + " \"name\": \"Alice\",\n" + " \"age\": 25\n" + "}"; // Java 15+ String json = """ { "name": "Alice", "age": 25 } """;
4. Record 类 - Java 16
- 是什么:一种用于存储不可变数据的简洁的语法,自动生成
constructor,getters,equals(),hashCode(),toString()。 - 为什么重要:彻底简化了值对象(Data Carrier)的创建,减少了大量样板代码,意图更明确。
- 示例:
// 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表达式结合使用可以实现更完备、更安全的模式匹配。 - 示例:
// 定义一个密封接口,只允许 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 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:
takeWhile,dropWhile方法,用于根据条件截取流。 - Java 16:
Stream.toList()方法,比collect(Collectors.toList())更简洁。 - 示例:
// 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 更现代化、易用。
- 示例:
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()); -

浙公网安备 33010602011771号