http://openjdk.java.net/projects/jdk9/ http://cr.openjdk.java.net/~iris/se/9/latestSpec/apidiffs/overview-summary.html
https://openjdk.java.net/projects/jdk/10/ http://cr.openjdk.java.net/~iris/se/10/latestSpec/apidiffs/overview-summary.html
https://openjdk.java.net/projects/jdk/11/ http://cr.openjdk.java.net/~iris/se/11/latestSpec/apidiffs/overview-summary.html
Erstens ist der Sprachwechsel.
var http://openjdk.java.net/jeps/286 Sie können jetzt Infer über lokale Variablen eingeben.
var a = "Foo";
Ich denke, das Folgende ist eine gute Richtlinie.
var
für Basisklassen wie java.lang
und java.util
verwenden.
--Wrapper-Klassen wie "Integer" und "Long" werden mit Vorsicht behandelt, daher ist es besser, "var" nicht zu verwenden.var
für den Basistyp verwendenvar
nicht für Anwendungsklassen zu verwendenWenn eine Variable der Wrapper-Klasse verwendet wird, wird null behandelt. Ich denke, es ist besser, den Typ anzugeben. Wenn Sie nicht null verwenden, verwenden Sie den Basistyp. Bei Anwendung auf Punkt 1 ist der folgende Schreibstil in Ordnung.
var count = Long.valueOf("123");
Für die Methoden "Integer" und "Long" gibt es jedoch einige, die den Basistyp zurückgeben, und einige, die den Wrapper-Typ zurückgeben. Daher ist es sicherer, den Typ anzugeben.
Wenn Sie es mit var
erhalten, ist es besser, es zu einem Basistyp zu machen.
private interface methods http://openjdk.java.net/jeps/213
Sie können jetzt private Methoden für die Schnittstelle verwenden.
Da die statische Methode und die Standardmethode in Java8 verwendet werden können, kann die allgemeine Verarbeitung in "privat" geschrieben werden.
effective final in try-with-resource http://openjdk.java.net/jeps/213
Es ist jetzt möglich, nur Variablen mit Try-with-Resource für praktisch endgültige Variablen anzugeben. Wenn Sie bisher eine außerhalb von "try" definierte "Closable" -Variable automatisch mit "try-with-resource" schließen wollten, mussten Sie sie einer anderen Variablen zuweisen. Wenn Sie es beispielsweise endgültig verwenden möchten, müssen Sie eine Variable außerhalb von try definieren. In einem solchen Fall können Sie sie jedoch verwenden.
var io = new InputStream();
try (var io2 = io) {
...
}
↓
var io = new InputStream();
try (io) {
...
}
<> in anonymous Anonyme Klassen können jetzt mit dem Diamantoperator vom Typ abgeleitet werden.
List<String> strs = new ArrayList<>() {{
this.add("aa");
this.add("bb");
}};
Sie können _
nicht mehr als Variable verwenden.
API
Von hier aus werden wir die Änderungen in der Standardbibliothek für jede Klasse zusammenfassen.
Klicken Sie hier für die Java 11 API https://nowokay.hatenablog.com/entry/20180704/1530712754
java.lang
String Compact String http://openjdk.java.net/jeps/254 Es ist in Java 9 enthalten. Bis Java8 wurden Zeichen in UTF-16 als Zeichen gespeichert, sodass für jedes Zeichen 2 Byte verwendet wurden. Zeichenfolgen, die nur ASCII-Zeichen wie Alphabete und Zahlen enthalten, werden jetzt in 1 Byte gespeichert.
Indy String concatenation http://openjdk.java.net/jeps/280
Bisher wurde die Verkettung von Zeichenfolgen mit "+" zu "StringBuilder" erweitert, sie wird jedoch zur Laufzeit mit Invoke Dynamic bestätigt.
"aa"+ a
↓
new StringBuilder("aa").append(a);
↓ Dynamic Invoke
repeat(n) Kann wiederholt werden
jshell> "test".repeat(3)
$1 ==> "testtesttest"
isBlank()
isBlank ist ein UTF-Leerzeichen
strip() / stripLeading() / stripTrailing()
UTF-Version von trim () / trimLeft () / trimRight ()
lines()
Gibt für jeden Zeilenumbruch einen Stream von Zeichenfolgen zurück
"test\nprogram\n".lines()
.map(String::strip)
.collect(Collectors.joining("\n")
Auf diese Weise kann der Platz vor und nach jeder Zeile entfernt werden.
java.util
List/Set/Map of http://openjdk.java.net/jeps/269
Gibt eine unveränderliche Sammlung zurück
var strs = List.of("apple", "banana");
var sets = Set.of("apple", "banana");
var dict = Map.of(
"apple", "Apfel",
"banana", "Banane");
copyOf Gibt eine unveränderliche Kopie zurück
Map ofEntries() / entry()
Map wird nicht nur of
, sondern auch ofEntries ()
hinzugefügt.
var map = Map.ofEntries(
entry("key1", "value1"),
entry("key2", "value2"));
Predicate not
Bequeme Inversion der Methodenreferenz
lines.stream()
.filter(not(String::isEmpty))
.forEach(System.out::println);
Collection toArray(IntFunction)
Bei der Konvertierung von List usw. in ein Array musste im Voraus ein Array mit derselben Größe vorbereitet werden. Sie können jedoch ein Array wie strs.toArray (String [] :: new)
generieren
Stream dropWhile / takeWhile
In Java 8 war eine Stream-Verarbeitung wie "von Anfang bis Ende in Daten" nicht möglich, kann jedoch mithilfe von dropWhile / takeWhile implementiert werden, das in Java 9 eingeführt wurde.
jshell> Stream.of("one", "start", "two", "three", "end", "four").
...> dropWhile(s -> !s.equals("start")).
...> takeWhile(s -> !s.equals("end")).
...> forEach(System.out::println)
start
two
three
In diesem Fall enthält es bis zu "Start", Sie müssen es also überspringen.
jshell> Stream.of("one", "start", "two", "three", "end", "four").
...> dropWhile(s -> !s.equals("start")).
...> skip(1).
...> takeWhile(s -> !s.equals("end")).
...> forEach(System.out::println)
two
three
ofNullable
iterate
Wütend mit zwei Argumenten ist seit Java8 verfügbar, aber es war notwendig, eine Stoppbedingung mit Limit usw. festzulegen.
IntStream.iterate(0, i -> i + 3).limit(5)
.forEach(System.out::println);
Ich hatte auch kein "takeWhile", daher war es ziemlich schwierig zu bedienen. Und jetzt können Sie "iterate" in Kombination mit "takeWhile" verwenden. Sie können es also wie eine for-Anweisung verwenden.
IntStream.iterate(0, i -> i < 10, i -> i + 3)
.forEach(System.out::println);
Wenn Sie dies folgendermaßen schreiben, wird es nicht zurückkommen. Überlegen Sie warum.
IntStream.iterate(0, i -> i < 10, i -> i++)
.forEach(System.out::println);
Ich kann dies tun
IntStream.iterate(0, i -> i < 10, i -> ++i)
.forEach(System.out::println);
Optional/OptionalInt/OptionalLong/OptionalDouble orElseThrow() isEmpty() stream()
Das Konvertieren von Optional zu Stream war noch nie einfacher.
Dadurch entfällt die Notwendigkeit, einen Filter (Optional :: isPresent) einzufügen, wenn ein Optional in einem Stream zurückgegeben wird.
Zum Beispiel, wenn getById
Optional zurückgibt
ids.map(Data::getById)
.filter(Optional::isPresent)
.collect(Collectors.toList())
Wie ich es gemacht habe
ids.flatMap(id -> getById(id).stream())
.collect(Collectors.toList())
Mit flatMap können Sie so schreiben.
ifPresentOrElse or
Wenn Optional leer ist, ist es einfacher, etwas wie das folgende Optional zu schreiben.
Collectors toUnmodifiableList / toUnmodifiableSet / toUnmodifiableMap
Kollektor, der Werte in unveränderlichen Sammlungen speichert
filtering flatMapping
Enumeration asIterator
Objects requireNonNullElse requireNonNullElseGet
java.io
Path of
Files writeString
Das Schreiben von Text in eine Datei erfolgt in einer Zeile.
readString
Das Lesen von Text aus einer Datei erfolgt in einer Zeile.
Reader transferTo
Das Schreiben des vom Reader gelesenen Inhalts in Writer erfolgt in einer Zeile
nullReader Writer nullWriter
InputStream transferTo
Das Schreiben des von InputStream gelesenen Inhalts in OutputStream erfolgt in einer Zeile
nullInputStream
OutputStream nullOutputStream
java.net.http
Der HTTP-Zugriff wurde überarbeitet.
JVM
Log http://openjdk.java.net/jeps/158 http://openjdk.java.net/jeps/271
G1GC is the default GC http://openjdk.java.net/jeps/248
ZGC
CMS is deprecated http://openjdk.java.net/jeps/291
Ahead of time compilation http://openjdk.java.net/jeps/295
JShell http://openjdk.java.net/jeps/222
Launch Single-File Source-Code Programs
Sie können jetzt einen Java-Quellcode mit Java-Befehlen ausführen, ohne ihn mit Javac zu kompilieren.
Module System
Java EE and CORBA is dropped
Recommended Posts