Java 12的新功能

    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中實現的大多數新功能。我們還列出了其他一些值得注意的添加和刪除。