拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java 12的新功能

Java 12的新功能

白鹭 - 2021-11-24 484 0 0

1.简介

在本教程中,我们将简要概述Java 12附带的一些新功能。有关所有新功能的完整列表,请参见官方文档

2.语言更改和功能

Java 12引入了许多新的语言功能。在本节中,我们将通过代码示例讨论一些最有趣的代码,以更好地理解。

2.1。字符串类新方法

Java 12在String类中带有两个新方法。

第一个indent基于整数参数调整每行的缩进。如果参数大于零,则将在每行的开头插入新的空格。另一方面,如果参数小于零,则它将从每行的行距中删除空格。如果给定的行没有足够的空格,则将删除所有前导空格字符。

现在,让我们看一个基本的例子。首先,我们将文本缩进四个空格,然后删除整个缩进:

String text = "Hello Baeldung!\nThis is Java 12 article.";



 text = text.indent(4);

 System.out.println(text);



 text = text.indent(-10);

 System.out.println(text);

输出如下所示:

 Hello Baeldung!

 This is Java 12 article.



 Hello Baeldung!

 This is Java 12 article.

请注意,即使我们传递的值-10(超过缩进计数)也仅会影响空格。其他字符保持不变。

第二种新方法是transform 。它接受单个参数函数作为将应用于字符串的参数。

例如,让我们使用transform方法还原字符串:

@Test

 public void givenString_thenRevertValue() {

 String text = "Baeldung";

 String transformed = text.transform(value ->

 new StringBuilder(value).reverse().toString()

 );



 assertEquals("gnudleaB", transformed);

 }

2.2。 File::mismatch方法

Java 12在nio.file.Files实用程序类中引入了新的mismatch方法:

public static long mismatch(Path path, Path path2) throws IOException

该方法用于比较两个文件并查找其内容中第一个不匹配字节的位置。

返回值将在0L到较小文件字节大小的范围内,如果文件相同,则返回值-1L。

现在让我们看两个例子。在第一个中,我们将创建两个相同的文件并尝试查找不匹配的文件。返回值应为-1L:

@Test

 public void givenIdenticalFiles_thenShouldNotFindMismatch() {

 Path filePath1 = Files.createTempFile("file1", ".txt");

 Path filePath2 = Files.createTempFile("file2", ".txt");

 Files.writeString(filePath1, "Java 12 Article");

 Files.writeString(filePath2, "Java 12 Article");



 long mismatch = Files.mismatch(filePath1, filePath2);

 assertEquals(-1, mismatch);

 }

在第二个示例中,我们将创建两个具有“ Java 12 Article”和“ Java 12 Tutorial”内容的文件。不匹配方法应返回8L,因为它是第一个不同的咬合:

@Test

 public void givenDifferentFiles_thenShouldFindMismatch() {

 Path filePath3 = Files.createTempFile("file3", ".txt");

 Path filePath4 = Files.createTempFile("file4", ".txt");

 Files.writeString(filePath3, "Java 12 Article");

 Files.writeString(filePath4, "Java 12 Tutorial");



 long mismatch = Files.mismatch(filePath3, filePath4);

 assertEquals(8, mismatch);

 }

2.3. Teeing Collector

Java 12中引入了一个新的teeing收集器,作为Collectors类的补充:

Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,

 Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)

它是两个下游收集器的组合。每个元素都由两个下游收集器处理。然后将它们的结果传递到合并函数,并转换为最终结果。

Teeing Collector的示例用法是从一组数字中计算平均值。第一个收集器参数将对值进行求和,第二个收集器参数将为我们提供所有数字的计数。合并功能将获取这些结果并计算平均值:

@Test

 public void givenSetOfNumbers_thenCalculateAverage() {

 double mean = Stream.of(1, 2, 3, 4, 5)

 .collect(Collectors.teeing(Collectors.summingDouble(i -> i),

 Collectors.counting(), (sum, count) -> sum / count));

 assertEquals(3.0, mean);

 }

2.4. 紧凑数字格式

Java 12附带了一个新的数字格式化程序– CompactNumberFormat 。它旨在根据给定语言环境提供的模式,以较短的形式表示数字。

我们可以通过NumberFormat类中的getCompactNumberInstance方法获取其实例:

public static NumberFormat getCompactNumberInstance(Locale locale, NumberFormat.Style formatStyle)

如前所述,locale参数负责提供适当的格式模式。格式样式可以是SHORT或LONG。为了更好地理解格式样式,让我们考虑美国区域设置中的数字1000。短样式将其格式设置为“ 10K”,长样式将其格式设置为“万”。

现在,让我们看一个示例,该示例将采用本文下的点赞次数,并使用两种不同的样式对其进行压缩:

@Test

 public void givenNumber_thenCompactValues() {

 NumberFormat likesShort =

 NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);

 likesShort.setMaximumFractionDigits(2);

 assertEquals("2.59K", likesShort.format(2592));



 NumberFormat likesLong =

 NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);

 likesLong.setMaximumFractionDigits(2);

 assertEquals("2.59 thousand", likesShort.format(2592));

 }

3.预览更改

其中一些新功能仅作为预览提供。要启用它们,我们需要在IDE中切换适当的设置,或者明确告诉编译器使用预览功能:

javac -Xlint:preview --enable-preview -source 12 src/main/java/File.java

3.1. Switch表达式(预览)

Java 12中引入的最流行的功能是开关表达式。

作为演示,让我们比较旧的和新的switch语句。我们将根据LocalDate实例的DayOfWeek枚举使用它们来区分工作日和周末。

首先,让我们看一下旧的语法:

DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

 String typeOfDay = "";

 switch (dayOfWeek) {

 case MONDAY:

 case TUESDAY:

 case WEDNESDAY:

 case THURSDAY:

 case FRIDAY:

 typeOfDay = "Working Day";

 break;

 case SATURDAY:

 case SUNDAY:

 typeOfDay = "Day Off";

 }

现在,让我们看一下相同的逻辑巫婆开关表达式:

typeOfDay = switch (dayOfWeek) {

 case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";

 case SATURDAY, SUNDAY -> "Day Off";

 };

新的switch语句不仅更紧凑和可读。它们还消除了break语句的需要。在第一个匹配之后,代码执行不会失败。

另一个显著的区别是我们可以将switch语句直接分配给变量。以前不可能。

也可以在开关表达式中执行代码而无需返回任何值:

switch (dayOfWeek) {

 case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> System.out.println("Working Day");

 case SATURDAY, SUNDAY -> System.out.println("Day Off");

 }

更复杂的逻辑应该用花括号括起来:

case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {

 // more logic

 System.out.println("Working Day")

 }

注意,我们可以在新旧语法之间进行选择。 Java 12开关表达式仅是扩展,而不是替代。

3.2。 instanceof模式匹配(预览)

Java 12中引入的另一个预览功能是instanceof模式匹配。

在以前的Java版本中,例如,当将if语句与instanceof,一起使用时instanceof,我们将必须显式转换对像以访问其功能:

Object obj = "Hello World!";

 if (obj instanceof String) {

 String s = (String) obj;

 int length = s.length();

 }

使用Java 12,我们可以在语句中直接声明新的类型转换变量:

if (obj instanceof String s) {

 int length = s.length();

 }

编译器将自动为我们注入类型转换String s变量。

4. JVM的变化

Java 12附带了一些JVM增强功能。在本节中,我们将快速浏览一些最重要的内容。

4.1 Shenandoah:低暂停时间的垃圾收集器

Shenandoah是一种实验性垃圾收集(GC)算法,目前尚未包含在默认的Java 12构建中。

通过与正在运行的Java线程同时执行疏散工作,可以减少GC的暂停时间。这意味着,对于Shenandoah,暂停时间不取决于堆的大小,而应保持一致。收集200 GB或2 GB堆的垃圾应具有类似的低暂停行为。

从版本15开始,Shenandoah将成为主线JDK构建的一部分。

4.2。Microbenchmark套件

Java 12向JDK源代码引入了大约100个Microbenchmark测试套件。

这些测试将允许在JVM上进行连续的性能测试,并将对希望使用JVM本身或创建新的微基准的每个开发人员都非常有用。

4.3 Default CDS Archives

类数据共享(CDS)功能有助于减少多个Java虚拟机之间的启动时间和内存占用。它使用内置的默认生成的默认类列表,其中包含选定的核心库类。

Java 12附带的更改是,默认情况下启用CDS存档。要在CDS关闭的情况下运行程序,我们需要将Xshare标志设置为off:

java -Xshare:off HelloWorld.java

请注意,这可能会延迟程序的启动时间。

5.结论

在本文中,我们看到了Java 12中实现的大多数新功能。我们还列出了其他一些值得注意的添加和删除。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *