Java 12 功能

最后,JDK 12是六个月的发布周期的一部分,它在最后的Java LTS版本11之后出现了,我们之前已经深入讨论了Java 11功能(/community/tutorials/java-11-features)。

Java 12 功能

Java 12 的一些重要功能是:

  1. JVM 更改 - JEP 189, JEP 346, JEP 344 和 JEP 230.
  2. 交换表达式
  3. 文件错误匹配() 方法
  4. 紧凑号码格式
  5. 在流程 API 中收集 Teeing 收集器6. Java 字符串新方法 - indent(), 转换(), 描述Constable(), 并解决ConstantDesc().
  6. JEP 334: JVM 常数 API
  7. JEP 305: 模型匹配 instanceof
  8. 原始字符串从 JDK 12.

让我们看看所有这些Java 12功能一个接一个。

JVM 变化

JEP189 - Shenandoah:一个低休息时间垃圾收集器(实验)

RedHat 启动了 Shenandoah Garbage Collector 以减少 GC 停机时间。 这个想法是与运行 Java 线程同时运行 GC。 它旨在实现一致且可预测的短暂停机,而不论堆积大小如何。

JEP 346 - 立即从 G1 返回未使用的承诺记忆

设置 Java 12 时,G1 将检查应用程序不活跃时的 Java Heap 内存,并将其返回操作系统,这是保护和使用自由内存的预防措施。

3. JEP 344 : 可取消的混合集合 G1

G1 效率的改进包括使 G1 混合集合如果可能超出定义的停留目标,则可以放弃。

JEP 230 和 344

Microbenchmark Suite,JEP 230功能为JDK源代码添加了一套基本的microbenchmarks。这使得开发人员可以轻松地运行现有的microbenchmarks并创建新的microbenchmarks。 One AArch64 Port, Not Two,JEP 344,删除与arm64端口相关的所有源,同时保持32位ARM端口和64位aarch64端口。

JEP 341 默认 CDS 档案

这增强了 JDK 构建过程,以在 64 位平台上使用默认类列表生成类数据共享 (CDS) 档案. 目标是改善启动时间. 从 Java 12 开始,CDS 默认启动。

1java -Xshare:off HelloWorld.java

现在,这将延迟项目的启动时间。

语言变化与特点

Java 12 引入了许多语言功能,让我们看看一些实现。

1. 交换表达式(预览)

Java 12 为模式匹配提供了改进的Switch表达式。在JEP 325(https://openjdk.java.net/jeps/325)中引入,作为预览语言功能,新语法为L ->

  • 新 Syntax 消除了需要打破声明以防止突破
  • 交换式表达式不再通过
  • 此外,我们可以定义相同标签中的多个常数
  • 在交换式表达式中默认案例现在是强制性的
  • 在交换式表达式中打破用于返回一个案例本身的值。

经典的Switch声明:

 1String result = "";
 2        switch (day) {
 3            case "M":
 4            case "W":
 5            case "F": {
 6                result = "MWF";
 7                break;
 8            }
 9            case "T":
10            case "TH":
11            case "S": {
12                result = "TTS";
13                break;
14            }
15        };
16
17        System.out.println("Old Switch Result:");
18        System.out.println(result);

有了新的 Switch 表达式,我们不需要在任何地方设置间歇,从而防止逻辑错误!

 1String result = switch (day) {
 2            case "M", "W", "F" -> "MWF";
 3            case "T", "TH", "S" -> "TTS";
 4            default -> {
 5                if(day.isEmpty())
 6                    break "Please insert a valid day.";
 7                else
 8                    break "Looks like a Sunday.";
 9            }
10
11        };
12
13        System.out.println(result);

让我们运行下面的程序,其中包含使用 JDK 12 的新交换表达式。

 1public class SwitchExpressions {
 2
 3    public static void main(String[] args)
 4    {
 5        System.out.println("New Switch Expression result:");
 6        executeNewSwitchExpression("M");
 7        executeNewSwitchExpression("TH");
 8        executeNewSwitchExpression("");
 9        executeNewSwitchExpression("SUN");
10    }
11
12    public static void executeNewSwitchExpression(String day){
13
14        String result = switch (day) {
15            case "M", "W", "F" -> "MWF";
16            case "T", "TH", "S" -> "TTS";
17            default -> {
18                if(day.isEmpty())
19                    break "Please insert a valid day.";
20                else
21                    break "Looks like a Sunday.";
22            }
23
24        };
25
26        System.out.println(result);
27    }
28}

由于这是预览功能,请确保您选择了语言水平作为Java 12预览。

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

运行编译程序后,我们在控制台中获得以下内容

Java Switch Expressions Program Output

交换表达式是一个 **预览语言功能,这意味着即使它是完整的,它可能不会在未来的Java版本中得到确认。

二、File.mismatch的方法

Java 12 添加了以下方法来比较两个文件:

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

此方法返回第一个错误匹配的位置或 -1L,如果没有错误匹配,两个文件可以在以下情况下出现错误匹配:

  • 如果字节不相同,则返回第一个不匹配字节的位置
  • 文件大小不相同,则返回较小的文件的大小

IntelliJ Idea 的示例代码片段如下:

 1import java.io.IOException;
 2import java.nio.file.Files;
 3import java.nio.file.Path;
 4
 5public class FileMismatchExample {
 6
 7    public static void main(String[] args) throws IOException {
 8        Path filePath1 = Files.createTempFile("file1", ".txt");
 9        Path filePath2 = Files.createTempFile("file2", ".txt");
10        Files.writeString(filePath1,"JournalDev Test String");
11        Files.writeString(filePath2,"JournalDev Test String");
12
13        long mismatch = Files.mismatch(filePath1, filePath2);
14
15        System.out.println("File Mismatch position... It returns -1 if there is no mismatch");
16
17        System.out.println("Mismatch position in file1 and file2 is >>>>");
18        System.out.println(mismatch);
19
20        filePath1.toFile().deleteOnExit();
21        filePath2.toFile().deleteOnExit();
22
23        System.out.println();
24
25        Path filePath3 = Files.createTempFile("file3", ".txt");
26        Path filePath4 = Files.createTempFile("file4", ".txt");
27        Files.writeString(filePath3,"JournalDev Test String");
28        Files.writeString(filePath4,"JournalDev.com Test String");
29
30        long mismatch2 = Files.mismatch(filePath3, filePath4);
31
32        System.out.println("Mismatch position in file3 and file4 is >>>>");
33        System.out.println(mismatch2);
34
35        filePath3.toFile().deleteOnExit();
36        filePath4.toFile().deleteOnExit();
37
38    }
39
40}

上述 Java 程序编译和运行时的输出是:

Java File Mismatch Example Program Output

3、数组格式化

 1import java.text.NumberFormat;
 2import java.util.Locale;
 3
 4public class CompactNumberFormatting {
 5
 6    public static void main(String[] args)
 7    {
 8        System.out.println("Compact Formatting is:");
 9        NumberFormat upvotes = NumberFormat
10                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
11        upvotes.setMaximumFractionDigits(1);
12
13        System.out.println(upvotes.format(2592) + " upvotes");
14
15        NumberFormat upvotes2 = NumberFormat
16                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
17        upvotes2.setMaximumFractionDigits(2);
18        System.out.println(upvotes2.format(2011) + " upvotes");
19    }
20
21}

Java Compact Number Formatting Program Output

四、收藏家

Teeing Collector 是 Streams API 中引入的新收集器实用程序. 这个收集器有三个参数 - 两个收集器和一个 Bi 函数. 所有输入值都传递给每个收集器,结果在 Bi 函数中可用。

1double mean = Stream.of(1, 2, 3, 4, 5)
2                .collect(Collectors.teeing(
3                        summingDouble(i -> i),
4                        counting(),
5                        (sum, n) -> sum / n));
6
7System.out.println(mean);

输出是 3.0

Java Strings 新方法

Java 12 中引入了 4 种新方法:

  • inent(int n)
  • 转换(函数 f)
  • 可选描述Constable()
  • String resolveConstantDesc (MethodHandles.Lookup lookup)

要详细了解上述方法,并在其中实施,请参阅我们的 Java 12 字符串方法( / 社区 / 教程 / Java-12 字符串方法)教程。

JEP 334: JVM 常态 API

一个新的包java.lang.constant被引入这个 JEP. 这对那些不使用常数集的开发者来说并不那么有用。

JEP 305:模型匹配为例(预览)

另一个预览语言功能! 将一个类型输入到另一个类型的旧方法是:

1if (obj instanceof String) {
2    String s = (String) obj;
3    // use s in your code from here
4}

新方法是:

1if (obj instanceof String s) {
2    // can use s directly here
3}

这节省了我们一些不必要的打字。

Raw String Literals 已从 JDK 12 中删除。

这就结束了这篇关于Java 12的文章。

Published At
Categories with 技术
Tagged with
comments powered by Disqus