Java Top.

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程

1.介绍

在本教程中,我们将快速、高层次地概述Java 12带来的一些新特性。所有新特性的完整列表可以在官方文件

2.语言更改和功能

Java 12引入了很多新语言功能。在本节中,我们将讨论一些最有趣的项目,以便更好地理解。

2.1。字符串类新方法

Java 12附带了两个新方法字符串班级

第一个 -缩进基于整数参数调整每行的缩进。如果参数大于零,则将在每行的开头插入新空格。另一方面,如果参数小于零,则会从每行的乞讨中删除空格。如果给定行不包含足够的空白空间,则删除所有领先的白色空间字符。

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

String text = "Hello 金宝搏188体育Baeldung! "\nThis is Java 12 article.";文本= text.indent (4);System.out.println(文本);文本= text.indent (-10);System.out.println(文本);

输出如下所示:

你好Bael金宝搏188体育dung!这是Java 12文章。你好Bael金宝搏188体育dung!这是Java 12文章。

请注意,即使传入值-10(它超过了缩进计数),也只有空格受到影响。其他字符保持不变。

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

作为一个例子,让我们使用transform方法来恢复字符串:

@test public void gendstring_thenrevertvalue(){String text =“bael金宝搏188体育dung”;字符串转换= text.transform(value  - > new Stringbuilder(值).reverse()。toString());断言(“GNUDLEAB”,转化);}

2.2。文件::不匹配方法

Java 12引入了一个新的不匹配方法nio.file.files.实用程序类:

public static long mismatch(Path Path, Path path2)抛出IOException

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

如果文件是相同的,则返回值将在0L的包含范围内为0L或-1L。

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

@Test public void givenIdenticalFiles_thenShouldNotFindMismatch() {Path filePath1 = Files。createTempFile (file1 . txt);Path filePath2 =文件。createTempFile(“file2”、" . txt ");文件。writeString(filePath1, "Java 12 Article");文件。writeString(filePath2, "Java 12 Article");long mismatch =文件。不匹配(filePath1, filePath2); assertEquals(-1, mismatch); }

在第二个例子中,我们将创建两个包含“Java 12 Article”和“Java 12 Tutorial”内容的文件。mismatch方法应该返回8L,因为它是第一个不同字节:

@Test public void givenDifferentFiles_thenShouldFindMismatch() {Path filePath3 = Files。createTempFile(“file3”、" . txt ");Path filePath4 =文件。createTempFile(“file4”," . txt ");文件。writeString(filePath3, "Java 12 Article");文件。writeString(filePath4,“Java 12教程”);long mismatch =文件。不匹配(filePath3, filePath4); assertEquals(8, mismatch); }

2.3。球座收集器

一个新的Teeing.收集器是在Java 12中引入的收藏家班级:

 teting(收集器 downstream1,收集器 downstream2,双函数合并)

这是两个下游收集器的复合。每个元素都由下游收集器处理。然后它们的结果将传递给合并功能并转换为最终结果。

tee收集器的示例用法是从一组数字中计算平均值。第一个收集器参数将对值求和,第二个参数将为我们提供所有数字的计数。merge函数会计算这些结果的平均值:

@Test public void givenSetOfNumbers_thenCalculateAverage() {double mean = Stream;(1, 2, 3, 4, 5) .collect(收集者。sum double (i -> i), collections .count (), (sum, count) -> sum / count));assertequal(3.0,意味着);}

2.4。紧凑的数字格式

Java 12带来了一个新的数字格式化器- 这CompactNumberFormat。它旨在基于由给定区域设置提供的模式来表示以较短形式的数字。

我们可以通过getCompactNumberInstance方法NumberFormat.班级:

公共静态NumberFormat GetCompactnumberinstance(Locale Locale,NumberFormat.Style FormarStyle)

如前所述,Locale参数负责提供适当的格式模式。格式样式可以短或长。为了更好地了解格式样式,让我们在美国语言环境中考虑数字1000。短风格会将其格式化为“10k”,漫长的人会将其作为“10万”。

现在让我们来看看一个榜样,这将占据本文下的喜欢的数量,并用两种不同的样式压缩它:

@Test public void givenNumber_thenCompactValues() {NumberFormat likesShort = NumberFormat。getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);likesShort.setMaximumFractionDigits (2);assertequal (2.59 k, likesShort.format (2592);NumberFormat likeeslong = NumberFormat。getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG); likesLong.setMaximumFractionDigits(2); assertEquals("2.59 thousand", likesShort.format(2592)); }

3.预览更改

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

src/main/java/File.java . xlint——enable-preview -source 12

3.1。转换表达式(预览)

在Java 12中引入的最受欢迎的功能是切换表达式

作为演示,让我们比较旧的和新的交换机语句。我们将使用它们来区分基于周末日的工作日Dayofweek.枚举来自LocalDate实例。

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

Dayofweek Dayofweek = localdate.now()。getdayofweek();字符串typeofday =“”;切换(Dayofweek){案件星期一:案例周二:案例周三:案例周四:案例周五:Typeofday =“工作日”;休息;案例星期六:案例星期日:TypeoFday =“截止日”;}

现在,让我们看看相同的逻辑Witch Switch表达式:

case星期一,星期二,星期三,星期四,星期五-> "工作日";case周六、周日->“休息日”;};

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

另一个值得注意的区别是,我们可以将switch语句直接赋值给变量。这在以前是不可能的。

也可以在切换表达式中执行代码而不返回任何值:

switch (dayOfWeek) {case周一,周二,周三,周四,周五-> System.out。println(“工作日”);案件星期六,星期天->系统。println(“休息日”);}

更复杂的逻辑应用卷曲括号包裹:

case星期一,星期二,星期三,星期四,星期五->{//更多的逻辑系统。println(工作日)}

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

3.2。模式匹配的instanceof.(预习)

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

在以前的java版本中,例如,如果语句一起使用instanceof.,我们必须明确地键入对象来访问其功能:

对象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();}

编译器将自动注入类型转换后的代码字符串的年代变量。

4. JVM更改

Java 12具有多种JVM增强功能。在本节中,我们将快速查看最重要的一个。

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

雪兰多是一种实验垃圾收集(GC)算法,目前还没有包含在默认的Java 12构建中。

它通过与正在运行的Java线程同时执行疏散工作来减少GC暂停时间。这意味着,在Shenandoah中,暂停时间不依赖于堆的大小,应该是一致的。垃圾收集200gb堆或2gb堆应该具有类似的低暂停行为。

Shenandoah将从version 15开始成为主流JDK构建的一部分。

4.2。微基准测试套件

Java 12向JDK源代码引入了大约100微型MicrobenchMarkmark测试的套件。

这些测试将允许在JVM上进行持续的性能测试,对于每一个希望在JVM上工作或创建新的微基准的开发人员来说都非常有用。

4.3。默认CDS存档

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

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

Java -Xshare:Off HelloWorld.java

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

结论

在本文中,我们看到了Java 12中实现的大多数新特性。我们还列出了其他一些值得注意的增加和删除。像往常一样,源代码是可用的在github上

Java底部

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程
评论在本文上关闭!