Zusammenfassung der neuen Funktionen von Java 12

Java 12 ist bereits in die Rampdown-Phase eingetreten und seine Funktionen sind fast abgeschlossen und werden am 19. März veröffentlicht, wenn alles gut geht. -> Es wurde getan. Daher werde ich die Funktionen, die Java 12 eingeben, in JEP, API und anderen zusammenfassen. JDK 12 Early-Access Builds

JEP Zunächst JEP-basierte Änderungen, die wichtige Funktionen zusammenfassen http://openjdk.java.net/projects/jdk/12/

Enthält insgesamt 8 JEPs. Die drei oben genannten und die Standard-CDS wirken sich wahrscheinlich auf den durchschnittlichen Java-Programmierer aus. Leider wurden Raw String Literals gelöscht. 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) 230: Microbenchmark Suite 325: Switch Expressions (Preview) 334: JVM Constants API 340: One AArch64 Port, Not Two 341: Default CDS Archives 344: Abortable Mixed Collections for G1 346: Promptly Return Unused Committed Memory from G1

Ich werde über jedes in der Reihenfolge schreiben, in der sie wahrscheinlich verwendet werden.

325: Switch Expressions (Preview) Die Switch-Anweisung wurde als Vorschaufunktion erweitert und kann jetzt als Ausdruck verwendet werden. (Um die Vorschaufunktion zu verwenden, müssen Sie --enable-Preview zu javac usw. hinzufügen.)

String time = switch (weekday) {
  case MONDAY, FRIDAY -> "10:00-18:00";
  case TUESDAY, THURSDAY -> "10:00-14:00";
  default -> "Urlaub";
};

Das sieht bis jetzt so aus.

String time;
switch (weekday) {
  case MONDAY:
  case FRIDAY:
    time = "10:00-18:00";
    break;
  case TUESDAY:
  case THURSDAY:
    time = "10:00-14:00";
    break;
  default:
    time = "Urlaub";
}

Ich denke, dies ist das Muster, das Sie meistens verwenden, wenn Sie "Schalter" verwenden. Beim herkömmlichen Switch ist die Menge an Beschreibungen natürlich groß, aber es hat Fehler wie das Auslassen von Unterbrechungen, das Aktualisieren der falschen Variablen und die Nichtgarantie verursacht, dass kein Auslassen von Aktualisierungen vorliegt. Dies wird gelöst, daher möchte ich es aktiv nutzen.

Tatsächlich ist es in drei zusätzliche Spezifikationen unterteilt.

Mehrere Fälle

Sie können jetzt mehrere Werte für "case" angeben.

String time;
switch (weekday) {
  case MONDAY, FRIDAY:
    time = "10:00-18:00";
    break;
  case TUESDAY, THURSDAY:
    time = "10:00-14:00";
    break;
  default:
    time = "Urlaub";
}

Rule Switch Mit -> ist eine Pause nicht mehr erforderlich.

String time;
switch (weekday) {
  case MONDAY, FRIDAY -> time = "10:00-18:00";
  case TUESDAY, THURSDAY -> time = "10:00-14:00";
  default -> time = "Urlaub";
}

Sie können auch mehrere Zeilen mit Blöcken verarbeiten.

String time;
switch (weekday) {
  case MONDAY, FRIDAY -> {
    var endTime = getEndTime();
    time = "10:00-" + endTime;
  }
  case TUESDAY, THURSDAY -> time = "10:00-14:00";
  default -> time = "Urlaub";
}

Ich möchte das positiv nutzen.

Schaltertyp

Und "Schalter" wurde ein Ausdruck. Wenn Sie die Pfeilsyntax nicht verwenden oder wenn Sie Blöcke für die Pfeilsyntax verwenden, gibt break den Wert zurück.

String time = switch (weekday) {
  case MONDAY, FRIDAY ->  {
    var endTime = getEndTime();
    break "10:00-" + endTime;
  }
  case TUESDAY, THURSDAY -> "10:00-14:00";
  default -> "Urlaub";
};

Ein Fehler tritt auf, wenn nicht alle Eingaben unterstützt werden können.

jshell> switch("a"){ case "a" -> 3;}
|Error:
|Der Schalterausdruck deckt nicht alle möglichen Eingabewerte ab
|  switch("a"){ case "a" -> 3;}
|  ^--------------------------^

Die "Pause", die einen Wert zurückgibt, könnte "Pause" sein, wenn sie offiziell wird. Call for feedback -- enhanced switch In JDK 13 ist es jedoch "Ertrag".

341: Default CDS Archives

Es gibt einen Mechanismus, um Klassendaten im Voraus zu erstellen und gemeinsam zu nutzen. Bisher war es jedoch erforderlich, Klassendaten selbst als "java -Xshare: dump" zu erstellen. Ab JDK12 ist "lib / server / classes.jsa" im Voraus enthalten, daher ist diese Arbeit nicht erforderlich. Wenn "-Xshare: auto" in JDK11 die Standardeinstellung ist und "classes.jsa" vorhanden ist, erfolgt dies automatisch. Da CDS in verwendet wird, scheint es, dass CDS von Anfang an verwendet wird, ohne etwas zu tun. Dies sollte die Java-Startzeit verbessern.

189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) Dies ist ein von Red Hat entwickelter GC. Es scheint, dass sich die Stoppzeit nicht ändert, egal ob es sich um 2 GB oder 200 GB handelt.

Da es viele Codes gibt, die mit G1GC gemeinsam sind, scheint es, dass G1GC während der Entwicklung von Shenandoah verbessert werden könnte. Dieses JEP346 ist auch eine der Reflexionen solcher Verbesserungen unter der Entwicklung von Shenandoah in G1GC. Parallel Full GC für G1 in Java 10 scheint dasselbe zu sein. InfoQ: Die Zukunft von OpenJDK in Red Hat

JDK11 enthält übrigens auch zwei GCs, ZGC und Epsillon. JDK12 enthält also 7 GCs.

Der Standardwert ist Java 9 bis G1GC. JEP 248: Make G1 the Default Garbage Collector

Es scheint jedoch, dass Parallel GC in Umgebungen mit wenig Speicher und Serial GC in Single Core-Umgebungen verwendet wird.

Es scheint besser, ZGC nicht mit einem Heap von 32 GB oder weniger zu verwenden, daher denke ich, dass es verwendet wird, wenn es einen Heap von mehreren hundert GB bis zu mehreren TB gibt. Wie wäre es mit der richtigen Verwendung von G1GC und Shenandoah?

CMS ist seit Java 9 veraltet und wird in Zukunft entfernt JEP 291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector

Ich dachte auch, dass Epsilon GC gut wäre, wenn es mit jeder Anfrage wie ohne Server beginnt, aber als ich versuchte, Epsilon GC mit einem einfachen Programm zu verwenden, war es langsam.

230: Microbenchmark Suite Es gibt ein Benchmark-Framework namens JMH (Java Microbenchmark Harness?), Aber es scheint, dass es jetzt im JDK enthalten ist. Wartung synchronisieren? OpenJDK: jmh

Ich konnte jedoch kein Material darüber finden, was sich im Vergleich zur Verwendung eines externen JMH geändert hat und wie es verwendet wird.

334: JVM Constants API

Dynamische Klassendateikonstanten sind in Java 11 enthalten, und Invoke Dynamic kann zum Zeitpunkt der Klasseninitialisierung für die Verarbeitung verwendet werden. JEP 309: Dynamic Class-File Constants Zu diesem Zeitpunkt wurden jedoch keine Sprachspezifikationen oder APIs hinzugefügt, sodass ich meine eigene Klassendatei erstellen musste, um sie verwenden zu können.

Das Paket "java.lang.constant" wurde hinzugefügt, einschließlich der Schnittstelle "Constable" und der Schnittstelle "ConstantDesc". Und eine Klasse wie "String", "Integer", "Class", "Enum" usw., die sie nicht als Konstante verwendet, implementiert "Constable" und die Methode "descriptionConstable ()".

346: Promptly Return Unused Committed Memory from G1 Geben Sie im Leerlauf nicht verwendeten Speicher zurück. Reflexion von Änderungen in Shenandoah zu G1GC.

344: Abortable Mixed Collections for G1

Machen Sie Mixed GC stoptable. Ich weiß nicht, ob das von Shenandoah kommt.

340: One AArch64 Port, Not Two Da es zwei Quellcodes von arm64 und aarch64 als Port für ARM64bit gab, wurde arm64 anscheinend gelöscht, um Doppelarbeit zu vermeiden.

API Die API-Änderungen sind auch nicht auffällig und es scheint, dass es einige kleinere Korrekturen gibt.

CompactNumberFormat Es ist ein "NumberFormat", das eine große Zahl ausdrückt, z. B. 10.000 als 10.000 oder 10 KB. [JDK-8188147] Compact Number Formatting support - Java Bug System

Die Instanz wird mit der Methode "getCompactNumberInstance" von "java.text.NumberFormat" abgerufen. Im Falle eines japanischen Gebietsschemas sieht es so aus. Es scheint, dass Kyo nicht mit bis zu Billionen kompatibel ist.

jshell> import java.text.*

jshell> var cnf = NumberFormat.getCompactNumberInstance()
cnf ==> java.text.CompactNumberFormat@73cf7357

jshell> cnf.format(10000)
$4 ==> "10 000"

jshell> cnf.format(10000_0000)
$5 ==> "Ein hundert Millionen"

jshell> cnf.format(10000_0000_0000L)
$6 ==> "1 Billion"

jshell> cnf.format(10000_0000_0000_0000L)
$7 ==> "10000 Billionen"

Wenn Sie ein Gebietsschema angeben, müssen Sie auch einen Stil angeben. Sie können entweder "KURZ" oder "LANG" wählen. So sieht es mit SHORT aus.

jshell> cnf = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT)
cnf ==> java.text.CompactNumberFormat@952071d5

jshell> cnf.format(1000)
$9 ==> "1K"

jshell> cnf.format(1000_000)
$10 ==> "1M"

jshell> cnf.format(1000_000_000)
$11 ==> "1B"

jshell> cnf.format(1000_000_000_000L)
$12 ==> "1T"

jshell> cnf.format(1000_000_000_000_000L)
$13 ==> "1000T"

Es unterstützt bis zu T. Ist das nicht 1 Milliarde 1G? Es ist wie es ist. Geben wir "LONG" an.

jshell> cnf = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG)
cnf ==> java.text.CompactNumberFormat@38c39d6b

jshell> cnf.format(1000)
$15 ==> "1 thousand"

jshell> cnf.format(1000000)
$16 ==> "1 million"

jshell> cnf.format(1000000000)
$17 ==> "1 billion"

jshell> cnf.format(1000000000000L)
$18 ==> "1 trillion"

jshell> cnf.format(1000000000000000L)
$19 ==> "1000 trillion"

Im Fall von 1000 scheint es Kilos K zu sein, aber M und T schienen Millionen und Billionen anstelle von Mega und Tera zu sein.

Wenn Sie nach dem Dezimalpunkt anzeigen möchten, verwenden Sie "setMaximumFractionDigit" oder "setMinimumFractionDigit". Standardmäßig werden die Zahlen nach dem Dezimalpunkt gerundet.

jshell> cnf.format(123456)
$20 ==> "123 thousand"

Sie können "setMaximumFractionDigits" verwenden, um die maximale Anzahl von Stellen nach dem Dezimalpunkt anzugeben.

jshell> cnf.setMaximumFractionDigits(2)

jshell> cnf.format(123456)
$21 ==> "123.46 thousand"

jshell> cnf.format(123400)
$22 ==> "123.4 thousand"

Sie können setMinimumFractionDigits verwenden, um die minimale Anzahl von Stellen nach dem Dezimalpunkt anzugeben.

jshell> cnf.setMinimumFractionDigits(2)

jshell> cnf.format(123400)
$23 ==> "123.40 thousand"

String.indent(int) Fügt Einrückungen für die angegebene Anzahl von Zeichen hinzu.

jshell> "123\n456".indent(2)
$24 ==> "  123\n  456\n"

Sie können die Einrückung reduzieren, indem Sie einen negativen Wert angeben.

jshell> "  123\n 123".indent(-2)
$25 ==> "123\n123\n"

Es ist ein Überbleibsel von Raw String Literals. [JDK-8200435] String::align, String::indent - Java Bug System

Das align (), das auch für RSL eingegeben wurde, bleibt in ea27, sollte jedoch in ea28 verschwinden, da ein Lösch-Commit aufgetreten ist. [JDK-8215490] Remove String::align - Java Bug System

String.transform(Function<String, R>) Dies ist auch ein Überbleibsel von Raw String Literals. Wenn es eine Funktion gibt, die "String" nimmt und etwas zurückgibt, wendet sie es an. Allein damit habe ich das Gefühl, dass ich die Funktion einfach normal aufrufen sollte, aber als Motivation habe ich das Gefühl, dass ich in der Reihenfolge schreiben kann, in der ich denke. [JDK-8203703] String::transform - Java Bug System

Angenommen, Sie haben eine Funktion, die Ihnen eine Adresse durch Übergabe eines Namens gibt, und eine Funktion, die Ihnen die Bevölkerung durch Übergabe einer Adresse gibt. Hier ist Karte.

jshell> var addresses = Map.of("Mike", "Fukuoka", "John", "Tokyo")
addresses ==> {John=Tokyo, Mike=Fukuoka}

jshell> var population = Map.of("Tokyo", 30000000, "Fukuoka", 2000000)
population ==> {Fukuoka=2000000, Tokyo=30000000}

Und als ich sagte: "Ich möchte die Bevölkerung der Adresse der Person anzeigen, wenn ich den Namen übergebe", musste ich so etwas schreiben.

jshell> population.get(addresses.get(name))
$37 ==> 2000000

Obwohl es sich um einen Prozess handelt, bei dem "ein Name genommen und eine Adresse genommen wird, um die Bevölkerung aufzunehmen", muss in der Reihenfolge "Übergeben des Namens, um die Adresse zu übergeben, um die Bevölkerung zurückzugeben" geschrieben werden.

Dies kann wie folgt mit transform geschrieben werden.

jshell> name.transform(addresses::get).transform(population::get)
$38 ==> 2000000

Die Reihenfolge lautet "Nimm die Adresse mit Namen und nimm die Bevölkerung". Es gibt viele Sprachen, in denen "Funktion (Wert)" in der Reihenfolge "Wert → Funktion" in den Sprachspezifikationen geschrieben werden kann, aber vorerst scheint Java dies erkannt zu haben. Ich wünschte, ich könnte in Java in der Reihenfolge "Name → Adresse :: Get → Population :: Get" schreiben.

Collectors.teeing(Collector, Collector, BiFunction) Verbinden Sie die Ergebnisse der beiden Kollektoren. [JDK-8209685] Create Collector which merges results of two other collectors - Java Bug System

Wenn Sie beispielsweise eine Liste von Zeichenfolgen haben und leere Zeichenfolgen weglassen und durch Kommas trennen möchten, um die endgültige Anzahl von Elementen zu erhalten, können Sie diese nicht mit einem einzigen Stream-Prozess lösen, aber jetzt können Sie dies tun. Ich werde.

jshell> Stream.of("aaa", "", "bbb", "ccc").
   ...>   filter(Predicate.not(String::isEmpty)).
   ...>   collect(Collectors.teeing(
   ...>     Collectors.joining(","),
   ...>     Collectors.counting(),
   ...>     Map::entry))
$39 ==> aaa,bbb,ccc=3

Files.mismatch(Path, Path) Gibt die erste der beiden Dateien an einer anderen Position zurück. -1 für dieselbe Datei Ich habe eine "isSameFile", aber willst du nicht etwas anderes? Es scheint, dass es hinzugefügt wurde. [JDK-8202302](fs) New Files.mismatch method for comparing files - Java Bug System

InputStream.skipNBytes(long) Überspringt die angegebene Anzahl von Bytes und Daten. [JDK-8214072] InputStream.skipNBytes(long k) to skip exactly k bytes - Java Bug System

Ich habe das Gefühl, dass es ein "Überspringen (lang)" gibt, aber "Überspringen" gibt die tatsächlich erweiterte Nummer zurück, während "ÜberspringenNBytes" keinen Rückgabewert zurückgibt und einen Wert über das Ende des Streams hinaus angibt. Dann wird eine "EOFException" ausgelöst.

jshell> var input = new ByteArrayInputStream(new byte[5])
input ==> java.io.ByteArrayInputStream@64bf3bbf

jshell> input.skip(2)
$25 ==> 2

jshell> input.skip(4)
$26 ==> 3

jshell> input.reset()

jshell> input.skipNBytes(2)

jshell> input.skipNBytes(4)
|Ausnahme Java.io.EOFException
|        at InputStream.skipNBytes (InputStream.java:600)
|        at (#29:1)

CompletableFuture.exceptionallyAsync(Function) Die Methoden "ExceptionalAsync", "ExceptionalCompose" und "ExceptionalComposeAsync" wurden zu "CompletableFuture" hinzugefügt, um Ausnahmen zu behandeln. Tatsächlich wurde es der "CompletableStage" -Schnittstelle hinzugefügt, so dass es sich anfühlt, als wäre es implementiert worden. [JDK-8211010] Add exception handling methods to CompletionStage and CompletableFuture - Java Bug System

Es gibt bereits "außergewöhnlich", aber Compose- und Async-Versionen wurden hinzugefügt.

str.equals ("") bis str.isEmpty ()

Systemänderungen, die ich vornehmen kann. Diese Art des Refactorings ist häufig ebenfalls enthalten. [JDK-8214971] Replace use of string.equals("") with isEmpty() - Java Bug System

Andere

Java Flight Recorder Tool

Der Befehl jfr wurde hinzugefügt.

$ jfr print --categories GC --events CPULoad recording.jfr

Es scheint als verwendet zu werden [JDK-8205517] JFR tool - Java Bug System

Recommended Posts

Zusammenfassung der neuen Funktionen von Java 12
Zusammenfassung der neuen Funktionen von Java 13
Zusammenfassung der neuen Funktionen von Java 10
Zusammenfassung der neuen Funktionen von Java 14
Java EE 8 (Jakarta EE 8) Zusammenfassung der neuen Funktionen
Zusammenfassung des Java-Wissens
Java Generics Zusammenfassung
Java-bezogene Zusammenfassung
Java1.8 neue Funktionen
Zusammenfassung des Java 8-Dokuments
Zusammenfassung des Java 11-Dokuments
[Zusammenfassung] Zum Beispiel die Vorbereitung der Java-Umgebung
effektive Java 3. Zusammenfassung
Java statisch [Persönliche Zusammenfassung]
Java 8 Lambda-Ausdruck Feature
Thread sichere Zusammenfassung ~ Java ~
Zusammenfassung der primitiven Java-Spezialisierung
Zusammenfassung des Java-Entwicklungslinks
Persönliche Zusammenfassung über Java
Was ist neu in Java 8?
JSF2.3 neue Funktionsübersicht
Zusammenfassung der regulären Ausdrücke von Java
Was ist neu in Java 9,10,11
Zusammenfassung der Java-Unterstützung 2018
Zusammenfassung des Java-Entwurfsmusters
Java-Zusammenfassung für reservierte Wörter
Grobe Zusammenfassung des Java8-Streams
Zusammenfassung der Revisionen (neue Yuan-Probleme) nach Java-Version
Was ist Java Assertion? Zusammenfassung.
[Java] Neue Thread-Generierungsmethode (2)
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Progate Java (Anfänger) Review & Zusammenfassung
Neue Funktionen von Java7 bis Java8
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
Java8-Stream, Zusammenfassung des Lambda-Ausdrucks
Objektorientierte Zusammenfassung von Anfängern (Java)
Zusammenfassung der Grundlagen der Java-Sprache
Java-Tipps - Zusammenfassung der Federausführung
Zusammenfassung der Java Math Klasse
PrimeFaces 6.0.x Zusammenfassung der neuen Funktionen
[Java11] Stream Usage Summary -Basics-
[Java] Zusammenfassung der Steuerungssyntax
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der Entwurfsmuster
[Java] Neue Thread-Generierungsmethode (1)
[Java] Zusammenfassung der mathematischen Operationen
Neue Syntax für Java 12 Switch-Anweisungen
Berücksichtigung des Java Persistence Framework 2017 (Zusammenfassung) -1
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Java-Veröffentlichungsdatum und EOL-Zusammenfassung
Zusammenfassung des Pakets [Java Silver Study]
Java 9 neue Funktionen und Beispielcode
Zusammenfassung
AtCoder 400 Punkte Algorithmus Zusammenfassung (Java Edition)
Java
Java "Pass by Reference" Problemzusammenfassung
Java
Zusammenfassung der objektorientierten Programmierung mit Java
Probieren Sie Eclipse 4.7 Oxygen New 30+ / Java 10 var!