这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战。
书接上回,上回聊到Java10和11的变化,除了var感觉真没什么变化,今天继续往后面的版本来看。看了后面的版本更新就会faxing,10和11其实内容还是挺丰富的。事实就是如此,12-15都是一带而过的版本,几乎没什么摆的上台面的新功能,不知道是在划水还是在憋什么大招。
decimal类似数据格式化
CompactNumberFormat
首先出现在12的版本中,作用就是在不同的语言环境中给decimal类型的数据做格式化,比如美国的1000会写成1k,1000000会写成1M,在印度相应的就是1 हज़ार
和1 क.
。为了使这样的格式化更方便,就新增了这样的formater。具体是这么用的:
NumberFormat fmt = NumberFormat.getCompactNumberInstance(
new Locale("hi", "IN"), NumberFormat.Style.SHORT);
String result = fmt.format(1000);
好像是个没什么用的更新。
String新增方法
- indent:给字符串做缩进,接受一个int型的输入
- transform:接受一个转换函数,实现字符串的转换
更像一个函数式语言了,举个例子:
var result = "foo"
.transform(input -> input + " bar")
.transform(String::toUpperCase);
//output: FOO BAR
全新的switch
这个不是游戏机的switch,是switch表达式。之前的switch的写法相对冗长,大多数时候也只是作为一个优化多个if else的存在,使用起来也并不灵活。
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
default:
System.out.println(0);
}
还有就是,假如忘记在每个case中写break,那就都会走到default中,反正我是经历过自己写了这么蠢的bug。现在怎么写呢:
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
引入了->
,这里不是lambda,是会执行后面的语句的意思。可能是看了kotlin的设计,觉得不错就复制下来了。不过kotlin没有case,取而代之的是when,个人感觉更能表达分支的含义。新的写法的灵活之处在于:
static void howMany(int k) {
System.out.println(
switch (k) {
case 1 -> "one";
case 2 -> "two";
default -> "many";
}
);
}
这本质上是一个求值语句,可以放在任何需要求值的地方。
Java12的主要更新就是这些。