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

Nye funktioner i Java 11

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 (aktuel artikel) • Nye funktioner i Java 12
• 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. Oversigt

Oracle udgav Java 11 i september 2018, kun 6 måneder efter sin forgænger, version 10.

Java 11 er den første langtidssupportudgivelse (LTS) efter Java 8.  Oracle holdt også op med at understøtte Java 8 i januar 2019. Som følge heraf vil mange af os opgradere til Java 11.

I denne tutorial tager vi et kig på vores muligheder for at vælge en Java 11 JDK. Derefter vil vi udforske nye funktioner, fjernede funktioner og ydeevneforbedringer introduceret i Java 11.

Yderligere læsning:

Java 11 String API-tilføjelser

Lær om tilføjelser til String API i Java 11. Læs mere →

Java 11 Local Variable Syntaks for Lambda-parametre

Lær, hvordan du bruger var-syntaks med lambda-udtryk i Java 11Læs mere →

Negér en prædikatmetodereference med Java 11

Lær, hvordan du ophæver en prædikatmetodereference med Java 11. Læs mere →

2. Oracle vs. Open JDK

Java 10 var den sidste gratis Oracle JDK-udgivelse, som vi kunne bruge kommercielt uden en licens. Fra og med Java 11 er der ingen gratis langtidssupport (LTS) fra Oracle.

Heldigvis fortsætter Oracle med at levere Open JDK-udgivelser, som vi kan downloade og bruge uden beregning.

Udover Oracle er der andre Open JDK-udbydere, som vi kan overveje.

3. Udviklerfunktioner

Lad os tage et kig på ændringer af de almindelige API'er samt et par andre funktioner, der er nyttige for udviklere.

3.1. Nye strengmetoder

Java 11 føjer et par nye metoder til strengen klasse :er tom , linjer , strip , stripLeading , stripTrailing, og gentag .

Lad os se, hvordan vi kan bruge de nye metoder til at udtrække ikke-blanke, strippede linjer fra en flerlinjet streng:

String multilineString = "Baeldung helps \n \n developers \n explore Java.";
List<String> lines = multilineString.lines()
  .filter(line -> !line.isBlank())
  .map(String::strip)
  .collect(Collectors.toList());
assertThat(lines).containsExactly("Baeldung helps", "developers", "explore Java.");

Disse metoder kan reducere mængden af ​​boilerplate involveret i at manipulere strengobjekter og spare os for at skulle importere biblioteker.

I tilfælde af striben metoder, giver de lignende funktionalitet som den mere velkendte trim metode; dog med finere kontrol og Unicode-understøttelse.

3.2. Nye filmetoder

Derudover er det nu nemmere at læse og skrive String s fra filer.

Vi kan bruge den nye readString og writeString statiske metoder fra Filer klasse:

Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");

3.3. Samling til et array

java.util.Collection grænsefladen indeholder en ny standard toArray metode, som tager en IntFunction argument.

Dette gør det nemmere at oprette et array af den rigtige type fra en samling:

List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");

3.4. Ikke-prædikatmetoden

Et statisk ikke metode er blevet tilføjet til prædikatet interface. Vi kan bruge det til at negere et eksisterende prædikat, ligesom negatet metode:

List<String> sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " ");
List withoutBlanks = sampleList.stream()
  .filter(Predicate.not(String::isBlank))
  .collect(Collectors.toList());
assertThat(withoutBlanks).containsExactly("Java", "Kotlin");

Mens ikke(er blank) læser mere naturligt end isBlank .negate() , den store fordel er, at vi også kan bruge ikke med metodereferencer, såsom not(String:isBlank) .

3.5. Lokal-variabel syntaks for Lambda

Understøttelse af brug af den lokale variabelsyntaks (var nøgleord) i lambda-parametre blev tilføjet i Java 11.

Vi kan bruge denne funktion til at anvende modifikatorer på vores lokale variable, som at definere en typeannotation:

List<String> sampleList = Arrays.asList("Java", "Kotlin");
String resultString = sampleList.stream()
  .map((@Nonnull var x) -> x.toUpperCase())
  .collect(Collectors.joining(", "));
assertThat(resultString).isEqualTo("JAVA, KOTLIN");

3.6. HTTP-klient

Den nye HTTP-klient fra java.net.http pakken blev introduceret i Java 9. Den er nu blevet en standardfunktion i Java 11.

Den nye HTTP API forbedrer den samlede ydeevne og understøtter både HTTP/1.1 og HTTP/2:

HttpClient httpClient = HttpClient.newBuilder()
  .version(HttpClient.Version.HTTP_2)
  .connectTimeout(Duration.ofSeconds(20))
  .build();
HttpRequest httpRequest = HttpRequest.newBuilder()
  .GET()
  .uri(URI.create("http://localhost:" + port))
  .build();
HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
assertThat(httpResponse.body()).isEqualTo("Hello from the server!");

3.7. Nest-baseret adgangskontrol

Java 11 introducerer begrebet nestmates og de tilhørende adgangsregler i JVM.

En indlejring af klasser i Java indebærer både den ydre/hovedklasse og alle dens indlejrede klasser:

assertThat(MainClass.class.isNestmateOf(MainClass.NestedClass.class)).isTrue();

Indlejrede klasser er knyttet til NestMembers attribut, mens den ydre klasse er knyttet til NestHost attribut:

assertThat(MainClass.NestedClass.class.getNestHost()).isEqualTo(MainClass.class);

JVM-adgangsregler tillader adgang til private medlemmer mellem redekammerater; I tidligere Java-versioner nægtede refleksions-API'en den samme adgang.

Java 11 løser dette problem og giver mulighed for at forespørge de nye klassefilattributter ved hjælp af refleksions-API:

Set<String> nestedMembers = Arrays.stream(MainClass.NestedClass.class.getNestMembers())
  .map(Class::getName)
  .collect(Collectors.toSet());
assertThat(nestedMembers).contains(MainClass.class.getName(), MainClass.NestedClass.class.getName());

3.8. Kører Java-filer

En større ændring i denne version er, at vi ikke behøver at kompilere Java-kildefilerne med javac eksplicit længere:

$ javac HelloWorld.java
$ java HelloWorld 
Hello Java 8!

I stedet kan vi køre filen direkte ved hjælp af java  kommando:

$ java HelloWorld.java
Hello Java 11!

4. Ydeevneforbedringer

Lad os nu tage et kig på et par nye funktioner, hvis hovedformål er at forbedre ydeevnen.

4.1. Dynamiske klasse-fil-konstanter

Java klasse-filformat er udvidet til at understøtte en ny konstant-pulje-form med navnet CONSTANT_Dynamic .

Indlæsning af den nye konstant-pulje vil delegere oprettelse til en bootstrap-metode, ligesom at linke en invokedynamic  call site delegerer link til en bootstrap-metode.

Denne funktion forbedrer ydeevnen og er målrettet mod sprogdesignere og compilerimplementatorer.

4.2. Forbedrede Aarch64 Intrinsics

Java 11 optimerer de eksisterende streng- og array-egenskaber på ARM64- eller AArch64-processorer. Derudover implementeres nye intrinsics for sin, cos, og log metoder til java.lang.Math .

Vi bruger en iboende funktion som enhver anden; dog bliver den iboende funktion håndteret på en særlig måde af compileren. Det udnytter CPU-arkitektur-specifik assembly-kode til at øge ydeevnen.

4.3. A No-Op Garbage Collector

En ny skraldeopsamler kaldet Epsilon er tilgængelig til brug i Java 11 som en eksperimentel funktion.

Det kaldes en No-Op (ingen operationer), fordi den tildeler hukommelse, men faktisk ikke samler noget affald. Epsilon er således anvendelig til simulering af hukommelsesfejl.

Epsilon vil naturligvis ikke være egnet til en typisk Java-produktionsapplikation; dog er der et par specifikke use-cases, hvor det kunne være nyttigt:

  • Performancetest
  • Hukommelsestryktest
  • VM-grænsefladetestning og
  • Ekstremt kortvarige job

For at aktivere det skal du bruge -XX:+Lås op for eksperimentelleVMOptioner -XX:+BrugEpsilonGC flag.

4.4. Flight Recorder

Java Flight Recorder (JFR) er nu open source i Open JDK , hvorimod det plejede at være et kommercielt produkt i Oracle JDK. JFR er et profileringsværktøj, som vi kan bruge til at indsamle diagnostik og profileringsdata fra en kørende Java-applikation.

For at starte en 120 sekunders JFR-optagelse kan vi bruge følgende parameter:

-XX:StartFlightRecording=duration=120s,settings=profile,filename=java-demo-app.jfr

Vi kan bruge JFR i produktionen, da dens ydelsesomkostninger normalt er under 1%. Når tiden er gået, kan vi få adgang til de registrerede data gemt i en JFR-fil; Men for at analysere og visualisere dataene skal vi bruge et andet værktøj kaldet JDK Mission Control (JMC).

5. Fjernede og forældede moduler

Efterhånden som Java udvikler sig, kan vi ikke længere bruge nogen af ​​dets fjernede funktioner og bør stoppe med at bruge alle forældede funktioner. Lad os tage et hurtigt kig på de mest bemærkelsesværdige.

5.1. Java EE og CORBA

Standalone versioner af Java EE-teknologierne er tilgængelige på tredjepartswebsteder; derfor er det ikke nødvendigt for Java SE at inkludere dem.

Java 9 har allerede forældet udvalgte Java EE- og CORBA-moduler. I release 11 har den nu fuldstændig fjernet:

  • Java API til XML-baserede webtjenesterer (java.xml.ws )
  • Java-arkitektur til XML-binding (java.xml.bind )
  • JavaBeans Activation Framework (java.activation )
  • Almindelige annotationer (java.xml.ws.annotation )
  • Common Object Request Broker Architecture (java.corba)
  • JavaTransaction API (java.transaction )

5.2. JMC og JavaFX

JDK Mission Control (JMC) er ikke længere inkluderet i JDK. En selvstændig version af JMC er nu tilgængelig som en separat download.

Det samme gælder for JavaFX-moduler; JavaFX vil være tilgængelig som et separat sæt moduler uden for JDK.

5.3. Forældede moduler

Java 11 udfasede desuden følgende moduler:

  • Nashorn JavaScript-motor, inklusive JJS-værktøjet
  • Pack200-komprimeringsskema for JAR-filer

6. Diverse ændringer

Java 11 introducerede nogle flere ændringer, som er vigtige at nævne:

  • Nye ChaCha20- og ChaCha20-Poly1305-krypteringsimplementeringer erstatter den usikre RC4-stream-chiffer
  • Understøttelse af kryptografisk nøgleaftale med Curve25519 og Curve448 erstatter den eksisterende ECDH-ordning
  • Opgraderet Transport Layer Security (TLS) til version 1.3 giver forbedringer af sikkerhed og ydeevne
  • Introducerede en lav latency skraldeopsamler, ZGC, som en eksperimentel funktion med lave pausetider
  • Understøttelse af Unicode 10 giver flere tegn, symboler og emojis

7. Konklusion

I denne artikel udforskede vi nogle nye funktioner i Java 11.

Vi dækkede forskellene mellem Oracle og Open JDK. Vi har også gennemgået API-ændringer samt andre nyttige udviklingsfunktioner, ydeevneforbedringer og fjernede eller forældede moduler.

Som altid er kildekoden tilgængelig på GitHub.

Næste » Nye funktioner i Java 12« ForrigeNye funktioner i Java 10
Java tag