Java >> Java tutorial >  >> Tag >> new

Nye funktioner i Java 12

Denne artikel er en del af en serie:• Nye funktioner i Java 8
• Nye funktioner i Java 9
• Nye funktioner i Java 10
• Nye funktioner i Java 11
• Nye funktioner i Java 12 (aktuel artikel) • Nye funktioner i Java 13
• Nye funktioner i Java 14
• Hvad er nyt i Java 15
• Nye funktioner i Java 16
• Nye funktioner i Java 17

1. Introduktion

I denne vejledning får vi en hurtig oversigt på højt niveau over nogle af de nye funktioner, der fulgte med Java 12. En komplet liste over alle nye funktioner er tilgængelig i den officielle dokumentation.

2. Sprogændringer og funktioner

Java 12 introducerer en masse nye sprogfunktioner. I dette afsnit vil vi diskutere nogle af de mest interessante med kodeeksempler for bedre forståelse.

2.1. Streng klasse nye metoder

Java 12 kommer med to nye metoder i strengen klasse.

Den første – indryk justerer indrykningen af ​​hver linje baseret på heltalsparameteren. Hvis parameteren er større end nul, vil der blive indsat nye mellemrum i begyndelsen af ​​hver linje. På den anden side, hvis parameteren er mindre end nul, fjerner den mellemrum fra begyndelsen af ​​hver linje. Hvis en given linje ikke indeholder tilstrækkeligt mellemrum, fjernes alle indledende mellemrumstegn.

Lad os nu tage et kig på et grundlæggende eksempel. Først indrykker vi teksten med fire mellemrum, og derefter fjerner vi hele indrykningen:

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);

Outputtet ser således ud:

    Hello Baeldung!
    This is Java 12 article.

Hello Baeldung!
This is Java 12 article.

Bemærk, at selvom vi passerede værdien -10, som overstiger vores indrykningsantal, var det kun mellemrummene, der blev påvirket. Andre tegn er intakte.

Den anden nye metode er transform . Den accepterer en enkelt argumentfunktion som en parameter, der vil blive anvendt på strengen.

Lad os som et eksempel bruge transformationsmetoden til at vende strengen:

@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 Metode

Java 12 introducerede en ny mismatch metode i nio.file.Files hjælpeklasse:

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

Metoden bruges til at sammenligne to filer og finde placeringen af ​​den første umatchede byte i deres indhold.

Returværdien vil være i området 0L op til bytestørrelsen for den mindre fil eller -1L, hvis filerne er identiske.

Lad os nu tage et kig på to eksempler. I den første opretter vi to identiske filer og forsøger at finde en uoverensstemmelse. Returværdien skal være -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);
}

I det andet eksempel opretter vi to filer med indholdet "Java 12 Article" og "Java 12 Tutorial". Mismatch-metoden skulle returnere 8L, da det er den første forskellige byte:

@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

En ny teeing collector blev introduceret i Java 12 som en tilføjelse til Collectors klasse:

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

Det er en sammensætning af to nedstrøms samlere. Hvert element behandles af begge downstream-opsamlere. Derefter sendes deres resultater til flettefunktionen og transformeres til det endelige resultat.

Eksemplet på brugen af ​​tee-samler er at tælle et gennemsnit fra et sæt tal. Den første samlerparameter vil opsummere værdierne, og den anden vil give os optællingen af ​​alle tal. Sammenfletningsfunktionen tager disse resultater og tæller gennemsnittet:

@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. Kompakt talformatering

Java 12 kommer med en ny talformatering - CompactNumberFormat . Det er designet til at repræsentere et tal i en kortere form, baseret på de mønstre, der leveres af en given lokalitet.

Vi kan få dens instans via getCompactNumberInstance metode i NumberFormat klasse:

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

Som nævnt før er locale-parameteren ansvarlig for at levere korrekte formatmønstre. Formatformatet kan være enten KORT eller LANG. For en bedre forståelse af formatstilene, lad os overveje nummer 1000 i den amerikanske lokalitet. Den KORTE stil ville formatere det som "10K", og den LANGE ville gøre det som "10 tusind".

Lad os nu tage et kig på et eksempel, der tager antallet af likes under denne artikel og komprimerer den med to forskellige stilarter:

@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", likesLong.format(2592));
}

3. Forhåndsvisning af ændringer

Nogle af de nye funktioner er kun tilgængelige som en forhåndsvisning. For at aktivere dem skal vi skifte korrekte indstillinger i IDE eller udtrykkeligt bede compileren om at bruge forhåndsvisningsfunktioner:

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

3.1. Skift udtryk (forhåndsvisning)

Den mest populære funktion introduceret i Java 12 er Switch Expressions.

Lad os som en demonstration sammenligne de gamle og nye switch-sætninger. Vi bruger dem til at skelne arbejdsdage fra weekenddage baseret på DayOfWeek enum fra LocalDate eksempel.

Lad os først se på den gamle syntaks:

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";
}

Og nu, lad os se de samme logiske hekseskift-udtryk:

typeOfDay = switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";
    case SATURDAY, SUNDAY -> "Day Off";
};

Nye switch-sætninger er ikke kun mere kompakte og læsbare. De fjerner også behovet for pauseerklæringer. Kodeeksekveringen vil ikke falde igennem efter den første match.

En anden bemærkelsesværdig forskel er, at vi kan tildele en switch-sætning direkte til variablen. Det var ikke muligt tidligere.

Det er også muligt at udføre kode i switch-udtryk uden at returnere nogen værdi:

switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> System.out.println("Working Day");
    case SATURDAY, SUNDAY -> System.out.println("Day Off");
}

Mere kompleks logik bør pakkes ind med krøllede seler:

case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {
    // more logic
    System.out.println("Working Day")
}

Bemærk, at vi kan vælge mellem den gamle og den nye syntaks. Java 12 switch-udtryk er kun en udvidelse, ikke en erstatning.

3.2. Mønstermatching for instanceof (Preview)

En anden preview-funktion introduceret i Java 12 er mønstermatching for instanceof .

I tidligere Java-versioner, når du f.eks. bruger if-sætninger sammen med instanceof, vi ville være nødt til eksplicit at typecaste objektet for at få adgang til dets funktioner:

Object obj = "Hello World!";
if (obj instanceof String) {
    String s = (String) obj;
    int length = s.length();
}

Med Java 12 kan vi erklære den nye typecastede variabel direkte i sætningen:

if (obj instanceof String s) {
    int length = s.length();
}

Compileren vil automatisk injicere den typecastede streng s variabel for os.

4. JVM-ændringer

Java 12 kommer med flere JVM-forbedringer. I dette afsnit får vi et hurtigt kig på nogle af de vigtigste.

4.1. Shenandoah:A Low-Pause-Time Garbage Collector

Shenandoah er en eksperimentel affaldsindsamlingsalgoritme (GC) , som for øjeblikket ikke er inkluderet i standard Java 12-builds.

Det reducerer GC-pausetiderne ved at udføre evakueringsarbejde samtidigt med de kørende Java-tråde. Det betyder, at med Shenandoah er pausetider ikke afhængige af dyngens størrelse og bør være konsekvente. Skrald, der samler en bunke på 200 GB eller en bunke på 2 GB, bør have en lignende lav pause-adfærd.

Shenandoah bliver en del af mainline JDK builds siden version 15.

4.2. Microbenchmark Suite

Java 12 introducerer en pakke med omkring 100 mikrobenchmark-test til JDK-kildekoden.

Disse tests giver mulighed for kontinuerlig ydeevnetest på en JVM og vil blive nyttige for enhver udvikler, der ønsker at arbejde på selve JVM'en eller oprette et nyt mikrobenchmark.

4.3. Standard CDS-arkiver

Funktionen Class Data Sharing (CDS) hjælper med at reducere opstartstiden og hukommelsesfodaftrykket mellem flere Java Virtual Machines. Den bruger en indbygget tidsgenereret standard klasseliste, der indeholder de valgte kernebiblioteksklasser.

Ændringen, der fulgte med Java 12, er, at CDS-arkivet er aktiveret som standard. For at køre programmer med CDS slået fra, skal vi indstille Xshare-flaget til off:

java -Xshare:off HelloWorld.java

Bemærk, at dette kan forsinke programmets opstartstid.

5. Konklusion

I denne artikel så vi de fleste af de nye funktioner implementeret i Java 12. Vi har også listet nogle andre bemærkelsesværdige tilføjelser og sletninger. Som sædvanlig er kildekoden tilgængelig på GitHub.

Næste » Nye funktioner i Java 13« ForrigeNye funktioner i Java 11
Java tag