Switch 表达式(预览特性)
在java12
之前版本的Switch
存在下面的问题:
下落(Fall-through) 行为:不写
break
语句的情况下,Switch 语句会从一个 case "穿透" 到下一个 case,忽略了这个会导致不可饶恕的错误。代码冗余:每个 case,我们都需要重复类似的代码结构,增加了代码的冗余和维护难度。
public static String getDayType(String datName) {
String result = "";
switch (datName) {
case "Monday":
result = "Workday";
break;
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
result = "Workday";
break;
case "Saturday":
case "Sunday":
result = "Weekday";
break;
default:
result = "UnknownDay";
}
return result;
}
可以优化为
public static String getDayType(String datName) {
String result = "";
switch (datName) {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> result = "Workday";
case "Saturday", "Sunday" -> result = "Weekday";
default -> result = "UnknownDay";
}
;
return result;
}
java13后 还可以优化为
public static String getDayType(String datName) {
return switch (datName) {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Workday";
case "Saturday", "Sunday" -> "Weekday";
default -> "UnknownDay";
};
}
支持压缩数字格式化
var compactNumberInstance = NumberFormat.getCompactNumberInstance(Locale.CHINA,NumberFormat.Style.SHORT);
System.out.println(compactNumberInstance.format(1_0000));
System.out.println(compactNumberInstance.format(1_9200));
System.out.println(compactNumberInstance.format(1_000_000));
System.out.println(compactNumberInstance.format(1L << 30));
System.out.println(compactNumberInstance.format(1L << 40));
System.out.println(compactNumberInstance.format(1L << 50));
String新增方法
indent(int n) 根据参数n对字符串进行缩进 transform() 将字符串转换为 R 形式的结果。 describeConstable() 该方法用于支持新的常量 API,它返回一个 Optional,描述字符串的常量描述。 resolveConstantDesc() 则与 describeConstable() 相关,用于解析常量描述
transform()
var result = "foo".transform(input -> input + " bar").transform(String::toUpperCase);
System.out.println(result); //FOO BAR
indent()
当
n>0
时,会在字符串的每一行开头插入n
个空格,字符串整体右移。当
n<0
时,会在字符串的每一行开头删除n
个空格,如果实际的空格数小于n
,删除该行所有空格,但是并不会换行。
String txt = "法外狂徒张三";
String s = txt.transform(str -> str.repeat(2));
System.out.println(s);
String s1 = txt.transform(str -> "罗教授:" + str.indent(2));
System.out.println(s1);
describeConstable()
=Optional.of(this)
public Optional<String> describeConstable() { return Optional.of(this); }
String txt = "法外狂徒张三";
Optional<String> s = txt.describeConstable();
System.out.println(s.orElse(null));
resolveConstantDesc()
String txt = "法外狂徒张三";
Optional<String> s1 = txt.describeConstable();
System.out.println(s1.orElse(""));
String s2 = txt.resolveConstantDesc(null);
System.out.println(s2);
新增Files API
Files
工具类中增加了一个新的静态方法Files.mismatch(Path,Path)
,用来找两个文件内容(byte
)不一样的地方,返回两个文件内容中第一个不匹配字节的位置,如果完全相同一个汉字,全角空格3个字节,数组和英文,半角空格都是1个字节
String txt1 = "x法外狂徒 张三";
Path path1 = Path.of("test1.txt");
String txt2 = "x法外狂徒 罗教授";
Path path2 = Path.of("test2.txt");
Files.writeString(path1, txt1);
Files.writeString(path2, txt2);
long mismatch = Files.mismatch(path1, path2);
System.out.println("mismatch: " + mismatch);
新增 Collectors API
对Stream流的聚合操作
Collector
进一步增强,增加了teeing
操作来实现一些复杂的聚合操作。它接受两个收集器(Collector)和一个二元运算函数(BiFunction),可以并行地将数据发送到两个不同的收集器,并在最后将这两个收集器的结果合并。public static <T, R1, R2, R> Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)
剩下更新内容建议去官网自行学习吧,翻阅了很多博主的文章,发现都是翻译了一下
官网地址如下