01 引言
从JDK8升级到JDK17,里面新增了有很多神仙级的语法,用起来非常丝滑,看起来也更加清爽。下来我们详细了解一下。
02 神仙语法
2.1 集合工厂方法
快速创建不可变集合的方法,该方法是来自JDK9的功能。
JDK9之前初始化不可变集合的方法:
java
体验AI代码助手
代码解读
复制代码
// 通过Arrays创建不可变集合 List<Integer> list = Arrays.asList(1, 2, 3, 4, 1);
Set
、Map
集合没有对应的方法,通过添加的方式或者通过第三方的方式,如guava
java
体验AI代码助手
代码解读
复制代码
// JDK 原生写法 Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); set.add(3); Map<String, String> map = new HashMap<>(); map.put("1", "1"); map.put("2", "2"); // guava 工具类 Set<Integer> set = Sets.newHashSet(1,2,3); ......
使用JDK9以后得写法:
java
体验AI代码助手
代码解读
复制代码
// 直接可以使用JDK方法 List<Integer> list = List.of(1, 2, 3, 4); Set<Integer> set = Set.of(1, 2, 3, 4); Map<String, String> map = Map.of("1", "1", "2", "2");
是不是看起来清爽多了,无需第三方依赖。但是需要注意的事,这里是不可变集合,无法新增或删除集合元素,如果操作会出现如下报错:
2.2 改进 Stream API
流处理里面的条件开关,该方法同样来自JDK9的功能。
takeWhile():
依次取出满足条件的集合数据,直到碰到第一个元素不满足条件时停止。
dropWhile():
依次剔除满足条件的集合数据,直到碰到第一个元素不满足条件时开始取出数据。
案例:依次取出数据,直到第一个元素大于3停止
List.of(1,2,3,4,2)
JDK9之前的写法:
java
体验AI代码助手
代码解读
复制代码
List<Integer> list = List.of(1, 2, 3, 4, 2); for (Integer item : list) { if (item > 3) { break; } System.out.println(item); } // 打印结果:1,2,3
JDK9之后的写法:
java
体验AI代码助手
代码解读
复制代码
List<Integer> list = List.of(1, 2, 3, 4, 2); list.stream().takeWhile(item -> item <= 3).forEach(System.out::println); // 打印结果:1,2,3
案例:依次剔除数据,直到第一个元素大于3开始获取数据
List.of(1,2,3,4,2)
JDK9之前的写法:
java
体验AI代码助手
代码解读
复制代码
List<Integer> list = List.of(1, 2, 3, 4,2); boolean flag = false; for (Integer item : list) { if (item > 3) { flag = true; } if (flag) { System.out.println(item); } } // 打印结果:4,2
JDK9之后的写法:
java
体验AI代码助手
代码解读
复制代码
List<Integer> list = List.of(1, 2, 3, 4,2); list.stream().dropWhile(item -> item <= 3).forEach(System.out::println); // 打印结果:4,2
2.3 文本块
支持多行字符串("""..."""
),简化 JSON/HTML 编写,以及支持格式化。这个是笔者最喜欢的语法。在大数据领域里面scala语言中简直不要太爽。该方法来自JDK15。
JDK15之前的多长字符串的写法需要自己拼接,使用了多上字符串的语法就可以保持格式。
java
体验AI代码助手
代码解读
复制代码
// JDK15 之前的写法 String htm = "<!DOCTYPE html>"; htm += "<html lang=\"en\">"; htm += "<body>测试</body>"; htm += "</html>"; System.out.println(htm); System.out.println("------------"); // JDK15 之后的写法 String html = """ <html lang="en"> <body>测试</body> </html> """; System.out.println(html);
看看打印的效果:
变量替换更简洁:
假设我们要替换文本的一个变量。以前的使用的String.format()
。如今语更加简洁,使用String.formatted()
方法。
java
体验AI代码助手
代码解读
复制代码
String context = "文本块"; String htm = "<!DOCTYPE html>"; htm += "<html lang=\"en\">"; htm += "<body>测试,%s</body>"; htm += "</html>"; System.out.println(String.format(htm, context)); System.out.println("----------"); String html = """ <html lang="en"> <body>测试,%s</body> </html> """; System.out.println(html.formatted(context));
效果如下:
2.4 Switch 箭头表达式
因为JDK8引入的Lamda表达式,箭头函数的用法开始在JAVA界普及,让人爱不释手。现在Switch
在JDK14里面正式支持。
一起看看前后的变化吧
java
体验AI代码助手
代码解读
复制代码
// JDK14之前的写法 int str = RandomUtil.randomInt(5); switch (str) { case 1: System.out.println("1"); case 2: System.out.println("2"); case 3: System.out.println("3"); default: System.out.println("default"); } // JDK14之后的写法 int str = RandomUtil.randomInt(5); switch (str) { case 1 -> System.out.println("1"); case 2 -> System.out.println("2"); case 3 -> System.out.println("3"); default -> System.out.println("default"); }
是不是清爽了很多,代码行数也减少了。
03 小结
从JDK8到JDK17新增的语法有很多,我会分几期挑选出比较有意思或者好用的语法,简单说明。我们下期见。