平台奖励创作,可能会升级VIP文章,可以移步我的公众号:【编程朝花夕拾】,且可获取首发内容。
01 引言
从JDK8升级到JDK17,里面新增了有很多神仙级的语法,用起来非常丝滑,看起来也更加清爽。下来我们详细了解一下。
02 神仙语法
2.1 集合工厂方法
快速创建不可变集合的方法,该方法是来自JDK9的功能。
JDK9之前初始化不可变集合的方法:
// 通过Arrays创建不可变集合
List<Integer> list = Arrays.asList(1, 2, 3, 4, 1);
Set
、Map
集合没有对应的方法,通过添加的方式或者通过第三方的方式,如guava
// 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以后得写法:
// 直接可以使用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之前的写法:
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之后的写法:
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之前的写法:
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之后的写法:
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之前的多长字符串的写法需要自己拼接,使用了多上字符串的语法就可以保持格式。
// 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()
方法。
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里面正式支持。
一起看看前后的变化吧
// 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新增的语法有很多,我会分几期挑选出比较有意思或者好用的语法,简单说明。我们下期见。