Java 9-15 ,语法新特性汇总

环境说明

  • OpenJdk 15
image
  • 开发工具 IDEA 2020.3.2
image

var 类型推断 | since jdk10

var 是 Java10 版本中新出的特性,用它来定义局部变量。var 不是关键字,相当于一种动态类型,编译器根据变量所赋的值来推断类型。所以必须在定义变量的时候赋初始值。

 @Test
 public void testJDK10VarLocalVariable(){
  var num1 = 1000;
  var num2 = 1.001;
  var str = "hello var";
  var list = new ArrayList<>();
  var map = new HashMap<>();
 }

 @Test
 public void testNoramlVariable(){
  int num1 = 1000;
  double num2 = 1.001;
  String str = "hello var";
  List list = new ArrayList<>();
  Map map = new HashMap();
 }

文本块 | since jdk13

在我们日常的工作中,有时候需要用到一大段的字符串,这些字符串需要换行,需要排版,需要转义。在一个文本编辑器中,这当然是非常容易的事情。但是在 java 代码中,就是一个噩梦了。而新的文本块使用"""这个符号,进行拼接。

  • 简化表达多行字符串,不需要转义;
  • 增强可读性;
 @Test
 public void testNormalString(){
  String text = "{" + "\n"
    +"    \"username\": \"lengleng\",\n"
    +"    \"password\": \"123456\" \n"
    +"}";
  System.out.println(text);
 }

 @Test
 public void testNewJdk13TextBlock(){
  var text = """
               {
                    "username": "lengleng",
                    "password": "123456"
               }
               """;
  System.out.println(text);
 }

switch 表达式 | since jdk12

  • 如下逻辑,当我们需要判断某天是否是工作日时候,需要大量的重复的 case 逻辑
 @Test
 public void testNormalSwitch() {
  int day = 2;
  switch (day) {
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
   System.out.println("workday");
  case 6:
  case 7:
   System.out.println("weekend");
  default:
   System.out.println("invalid");
  }
 }
  • jdk12 可以通过的 switch 表达式简化如上逻辑
@Test
 public void testNewJdk12MultiSwitch() {
  var day = 2;
  switch (day) {
  case 1, 2, 3, 4, 5 -> System.out.println("workday");
  case 6, 7 -> System.out.println("weekend");
  default -> System.out.println("invalid");
  }
 }

集合工厂 | since jdk9

  • 通常希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。实例化集合,几个 “add” 调用,使得代码重复。
 @Test
 public void testNormal(){
  List<String> fruitsTmp = new ArrayList<>();
  fruitsTmp.add("apple");
  fruitsTmp.add("banana");
  fruitsTmp.add("orange");


  Map<Integer, String> numbersTmp = new HashMap<>();
  numbersTmp.put(1, "one");
  numbersTmp.put(2, "two");
  numbersTmp.put(3, "three");
 }
  • 现在可以通过 of 方法来快速构建集合类型
@Test
 public void testNewJdk9() {
  var fruits = List.of("apple", "banana", "orange");
  var numbers = Map.of(1, "one", 2, "two", 3, "three");
 }

record 记录 | since jdk14

Records 的目标是扩展 Java 语言语法,Records 为声明类提供了一种紧凑的语法,用于创建一种类中是“字段,只是字段,除了字段什么都没有”的类。通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与 hashCode()等方法。干掉 lombok 只需要通过 record 声明即可完成实体字段的 get 和构造器方法。

public record Demo(String username, String password) {

}
 @Test
 public void testJdk15Record() {
  var demo = new Demo("lengleng", "123456");
  System.out.println(demo.password());
  System.out.println(demo.username());
 }

接口私有方法 | since jdk9

Java8 带来了许多改变,其中之一就是 default 修饰的接口方法。这些方法改变了我们已知的接口,现在我们能够在接口中定义默认实现方法。如果你大量使用 default 方法在你的应用接口中,现在可以通过 JDK9 的接口私有方法来重构。

public interface PrivateInterface {

 private void printF(){
  System.out.println("lengleng");
 }

 default void getPassword(){
  printF();
  System.out.println("123456");
 }
}
 @Test
 public void testGetPassword() {
  var privateInterface = new PrivateInterfaceImpl();
  privateInterface.getPassword();
 }

Sealed 类封闭 | since jdk15

可扩展性不是面向对象编程的一个重要指标吗?为什么要限制可扩展性呢?其实,面向对象编程的最佳实践之一,就是要把可扩展性的限制在可以预测和控制的范围内,而不是无限的可扩展性。

  • 通过 sealed 定义接口或者抽象类
public sealed interface Pet permits Cat {
}

  • 分配权限的子类可以正常的实现此接口
public final class Cat implements Pet {
}
  • 若没有子类没有分配权限,则编译直接报错
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容