从Java8到Java17(五)

201 阅读2分钟

这是我参与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的主要更新就是这些。