性能文章>Java 14,有哪几个值得关注的新特性?>

Java 14,有哪几个值得关注的新特性?转载

1月前
190403
 

概述

Java 14 于 2020 年 3 月 17 日发布。此版本引入了一些新功能作为预览,以便为未来版本标准化这些功能。本文列出了 Java 14 中的示例代码的重要特性。

#1 切换表达式(标准)

这是此版本中唯一的标准化功能,它是 Java 13 和 Java 12 中的预览功能。

在 Java 14 之前,当使用 switch 语句时,我们仅将其用作检查变量值的语句。根据这个变量的值,我们可以根据需要定义一组不同的语句来执行。

public class SwitchStatement {
    public static void main(String[] args) {
        Integer messageNumber = 2;
        switch (messageNumber) {
            case 1:
              System.out.println("Tech");
              break;
            case 2:
              System.out.println("Is");
              break;
            case 3:
              System.out.println("Beautiful");
              break;
            default:
              System.out.println("No message");
              break;
        }
    }
}
 

代码输出:

有了上面的写法,我们会遇到以下3个常见问题:

1.我们可以忘记声明一个break语句,这使得代码继续运行到下一个case,而不是匹配上一个case并停止。

public class SwitchStatement1Before14 {
    public static void main(String[] args) {
	Integer messageNumber = 2;
	switch (messageNumber) {
	    case 1:
	      System.out.println("Tech");
	      break;
	    case 2:
	      System.out.println("Is");
	    case 3:
	      System.out.println("Beautiful");
	      break;
	    default:
	      System.out.println("No message");
	      break;
	}
    }
}
 

代码输出:

2.如果要检查的变量值不同,但内部处理相同,会导致代码重复

public class SwitchStatement2Before14 {
    public static void main(String[] args) {
	Integer messageNumber = 2;
        switch (messageNumber) {
            case 1:
              System.out.println("Tech");
              break;
            case 2:
              System.out.println("Is");
              break;
            case 3:
              System.out.println("Beautiful");
	      break;
            case 4:
              System.out.println("Beautiful");
              break;
            default:
              System.out.println("No message");
	      break;
        }
    }
}
 

3.使用switch语句定义值必须冗长,使代码混乱。您必须编写以下内容:

public class SwitchStatement3Before14 {
    public static void main(String[] args) {
      Integer messageNumber = 2;
      String messageContent = "";
      switch (messageNumber) {
          case 1:
            messageContent = "Tech";
            break;
          case 2:
            messageContent = "Is";
            break;
          case 3:
            messageContent = "Beautiful";
            break;
          default:
            messageContent = "No message";
            break;
      }
      System.out.println(messageContent);
    }
}
 

从Java 14标准版开始,帮助解决了以上问题:

1. 新语法使用 -> 操作符,而不是我们习惯的冒号。没有 break 关键字:您不需要 break 语句来防止失败。

public class SwitchExpression1After14 {
    public static void main(String[] args) {
	Integer messageNumber = 1;
	switch (messageNumber) {
	    case 1 -> System.out.println("Tech");
	    case 2 -> System.out.println("Is");
	    case 3 -> System.out.println("Beautiful");
	    default -> System.out.println("No message");
	}
    }
}
 

代码输出:

2. 我们还建议每个案例允许多个变量,用逗号分隔。这有助于我们将多个有效表达式组合到同一个代码块中。避免创建多段相同的代码

public class SwitchExpression2After14 {
    public static void main(String[] args) {
      Integer messageNumber = 4;
      switch (messageNumber) {
          case 1 -> System.out.println("Tech");
          case 2 -> System.out.println("Is");
          case 3, 4 -> System.out.println("Beautiful");
          default -> System.out.println("No message");
      }
    }
}
 

代码输出:

3.使用“yield”关键字处理switch表达式的每种情况下的业务逻辑。它接受一个参数,即“case”标签在 switch 表达式中产生的值。它将返回我们期望的值:

public class SwitchExpression3After14 {
    public static void main(String[] args) {
	Integer messageNumber = 4;
	String messageContent =  switch (messageNumber) {
		case 1 -> "Tech";
		case 2 -> "Is";
		case 3 -> "Beautiful";
		case 4 -> {
			String firstMessage = "Expression";
			String lastMessage = "Switch";
			String fullMessage = firstMessage + lastMessage;
			yield fullMessage;
		}
		default -> "No message";
	};
	System.out.println(messageContent);
    }
}
 

代码输出:

新的 switch 表达式的好处包括由于没有失败行为而减少了错误的范围。

我们可以将 switch 表达式分配给变量,或者将它们放置在 Java 代码中需要表达式的任何位置。

#2 有用的 NullPointerExceptions

Java 14 通过准确显示哪个变量为空来帮助开发人员了解导致 NullPointerException 的原因。我们可以通过下面的代码看出区别:

public class NullPointerExceptions {
    public static void main(String[] args) {
        List<String> citys = null;
        System.out.print(citys.size());
    }
}
 

Java 14 之前的输出:

不使用调试器很难确定哪个变量为空。此外,JVM 只会打印出导致异常的方法、文件名和行号。

Java 14 之后的输出:

它通过更清晰地将动态异常与静态程序代码关联起来,极大地提高了程序的理解。

#3 “instanceof”的模式匹配(预览版)

通常,在使用 Java 开发应用程序时。对于应用程序,当我们需要处理某种类型的类,但我们有超类类型的引用时,我们需要检查该实例的类型。如果结果为真,下一步是将其转换为我们用来比较它的类型

下面这段代码有一个重复:compareToType — ifTrue — castToType。

public class InstanceofWithPatternMatchingBefore14 {
    public static void main(String[] args) {
	Object obj = "Tech is beautiful";
	if (obj instanceof String) {
	    String s = (String) obj;
	    if (s.length() > 5) {
	      System.out.println(s.toUpperCase());
	    }
	} else if (obj instanceof Integer) {
	    Integer i = (Integer) obj;
	    System.out.println(i);
	}
    }
}
 

代码输出:

“instanceof”运算符在 Java 14 中进行了改进,以测试参数并将其分配给具有适当类型的绑定变量。

在“instanceof”语句之后,我们现在可以指定一个变量名。如果 object 是指定类型,则绑定到新的变量名;然后这个新变量是指定的目标类型并且在“then 块”中可见。

public class InstanceofWithPatternMatchingAfter14 {
    public static void main(String[] args) {
	Object obj = "Tech is beautiful";
	if (obj instanceof String s) {
	    if (s.length() > 5) {
	      System.out.println(s.toUpperCase());
	    }
	} else if (obj instanceof Integer i) {
	    System.out.println(i * i);
	}
    }
}
 

结果也将返回相同的

这是一个语言功能,可以帮助进一步减少冗长,从而减少错误的可能性。

#4 记录(预览)

通常,要声明一个不可变类,我们会:

  • 将这个类声明为 final,这样任何类都不能从它扩展。
  • 将该类的字段声明为 private 和 final
  • 没有 Setter 方法,只有 Getter 方法
  • 如果该类的其中一个字段是对象,那么当我们获取该字段的信息时,我们需要返回该对象的副本。

下面是一个不可变类的示例。

public final class Employee {
    private final String name;
    private final int age;
    private final String department;

    public Employee(String name, int age, String department) {
	this.name = name;
	this.age = age;
	this.department = department;
    }

    public String getName() {
	return name;
    }

    public int getAge() {
	return age;
    }

    public String getDepartment() {
	return department;
    }

    @Override
    public String toString() {
	return "Employee{" +
	"name=" + name +
	", age=" + age +
	", department='" + department + '\'' +
	'}';
    }

    @Override
    public boolean equals(Object o) {
	return true;
    }

    @Override
    public int hashCode() {
	return Objects.hash(name, age, department);
    }
}
 

从 Java 14 开始,我们可以通过在声明类时使用 record 关键字来更快、更简单地做到这一点。除了构造函数和 getter 之外,此功能还会自动生成“equals”、“hashCode”和“toString”的实现。

我们只需要一行代码就可以实现上面的不可变“Employee”类,如下:

public record Empployee(String name, int age, String deparment) {}
 

现在,我们可以初始化并获取一个 Employee 对象的信息,如下所示:

public class Record14 {
    public record Employee(String name, int age, String department) {}
    public static void main(String[] args) {
	Employee employee = new Employee("Anonymous", 30, "Technical");
	System.out.println("Name: " + employee.name);
	System.out.println("age: " + employee.age);
	System.out.println("department: " + employee.department);
    }
}
 

代码输出:

此功能遵循减少 Java 冗长并帮助开发人员编写更简洁的代码的趋势。

#5 文本块(第二次预览)

以前,在Java中声明多行文本时,我们通常会这样做:

public class NoneTextBlock {
  public static void main(String[] args) {
      String noneTextBlock = "This is TechisBeautiful \n" + 
            "Welcome my blog";
      System.out.println(noneTextBlock);
  }
}
 

代码输出:

文本块可以更轻松地处理多行字符串。我们可以使用三个双引号字符(“””)在 Java 中声明多行字符串

public class TextBlock {
  public static void main(String[] args) {
      String textBlock = """
        This is TechisBeautiful
        Welcome my blog
        """;
      System.out.println(textBlock);
  }
}
 

它允许我们包含 HTML、JSON 或任何我们需要的文字片段

它还提供了两种添加方法来支持文本块。

  • \<end-of-line>禁止行终止。
  • \s被翻译成一个空格。

概括

这些是 Java 14 中前 5 个重要特性。我希望这篇文章能帮助你理解其中的一些新特性。当然也欢迎加入在留言区一起交流!

文章来源:博客园

原文链接:https://www.cnblogs.com/cyq1162/p/16554403.html

点赞收藏
分类:标签:
金色梦想

终身学习。

请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

干货!Java代码优化必知的30个小技巧!

干货!Java代码优化必知的30个小技巧!

【全网首发】一次jstack 的排查之旅

【全网首发】一次jstack 的排查之旅

Java 异步调用原理与实战

Java 异步调用原理与实战

代码改成多线程,竟有9大问题

代码改成多线程,竟有9大问题

【全网首发】关于可见性的这个例子,网上 95% 的文章都解释错了!

【全网首发】关于可见性的这个例子,网上 95% 的文章都解释错了!

Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量

Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量

3
0