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
Le premier est le changement de langue.
var http://openjdk.java.net/jeps/286 Vous pouvez maintenant taper infer sur les variables locales.
var a = "Foo";
Je pense que ce qui suit est une bonne ligne directrice.
--Il est préférable d'utiliser var
pour ceux avec des types sur le côté droit tels que new
et List.of
(autre que ʻInteger,
Long`, etc.)
var
pour les classes de base telles que java.lang
et java.util
.var
car les classes wrapper telles que ʻInteger et
Long` sont gérées avec précaution.var
pour le type de basevar
pour les classes d'applicationLorsque vous utilisez une variable de la classe wrapper, elle gère null, donc je pense qu'il est préférable de spécifier le type. Si vous n'utilisez pas null, utilisez le type de base. Lorsqu'il est appliqué à l'élément 1, le style d'écriture suivant est OK.
var count = Long.valueOf("123");
Cependant, pour les méthodes ʻIntegeret
Long, il y en a qui renvoient le type de base et d'autres qui renvoient le type wrapper, il est donc plus sûr de spécifier le type. Si vous le recevez avec
var`, il vaut mieux en faire un type de base.
private interface methods http://openjdk.java.net/jeps/213
Vous pouvez maintenant utiliser des méthodes privées pour l'interface.
Puisque la méthode statique et la méthode par défaut peuvent être utilisées dans Java8, le traitement commun peut être écrit en private
.
effective final in try-with-resource http://openjdk.java.net/jeps/213
Il est maintenant possible de spécifier uniquement des variables avec try-with-resource pour les variables pratiquement finales.
Jusqu'à présent, si vous vouliez fermer automatiquement une variable Closable
définie à l'extérieur de try
avec try-with-resource, vous deviez l'assigner à une autre variable. Par exemple, si vous souhaitez l'utiliser enfin, vous devez définir une variable en dehors de try, mais vous pouvez l'utiliser dans un tel cas.
var io = new InputStream();
try (var io2 = io) {
...
}
↓
var io = new InputStream();
try (io) {
...
}
<> in anonymous Les classes anonymes peuvent désormais être inférées de type avec l'opérateur losange.
List<String> strs = new ArrayList<>() {{
this.add("aa");
this.add("bb");
}};
Vous ne pouvez plus utiliser «_» comme variable.
API
À partir de là, nous résumerons les modifications apportées à la bibliothèque standard pour chaque classe.
Cliquez ici pour l'API Java 11 https://nowokay.hatenablog.com/entry/20180704/1530712754
java.lang
String Compact String http://openjdk.java.net/jeps/254 Il est inclus dans Java 9. Jusqu'à Java8, les caractères étaient conservés sous forme de char en UTF-16, donc 2 octets étaient utilisés pour chaque caractère, mais les chaînes de caractères contenant uniquement des caractères ASCII tels que les alphabets et les nombres sont désormais conservées dans 1 octet.
Indy String concatenation http://openjdk.java.net/jeps/280
Jusqu'à présent, la concaténation de chaînes avec +
a été étendue à StringBuilder
, mais elle sera confirmée lors de l'exécution avec Invoke Dynamic.
"aa"+ a
↓
new StringBuilder("aa").append(a);
↓ Dynamic Invoke
repeat(n) Peut être répété
jshell> "test".repeat(3)
$1 ==> "testtesttest"
isBlank()
isBlank est un caractère d'espace UTF
strip() / stripLeading() / stripTrailing()
Version UTF de trim () / trimLeft () / trimRight ()
lines()
Renvoie un flux de chaînes pour chaque saut de ligne
"test\nprogram\n".lines()
.map(String::strip)
.collect(Collectors.joining("\n")
En faisant cela, l'espace avant et après chaque ligne peut être supprimé.
java.util
List/Set/Map of http://openjdk.java.net/jeps/269
Renvoie une collection immuable
var strs = List.of("apple", "banana");
var sets = Set.of("apple", "banana");
var dict = Map.of(
"apple", "pomme",
"banana", "banane");
copyOf Renvoie une copie immuable
Map ofEntries() / entry()
Non seulement ʻofmais aussi ʻofEntries ()
ont été ajoutés à la carte.
var map = Map.ofEntries(
entry("key1", "value1"),
entry("key2", "value2"));
Predicate not
Inversion pratique de la référence de méthode
lines.stream()
.filter(not(String::isEmpty))
.forEach(System.out::println);
Collection toArray(IntFunction)
Lors de la conversion de List, etc. en tableau, il était nécessaire de préparer un tableau de même taille à l'avance, mais vous pouvez générer un tableau comme strs.toArray (String [] :: new)
Stream dropWhile / takeWhile
Dans Java 8, le traitement de flux tel que "du début à la fin dans les données" n'était pas possible, mais il peut être implémenté en utilisant dropWhile / takeWhile introduit dans Java 9.
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
Dans ce cas, il contient jusqu'à start
, vous devez donc l'ignorer.
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
Irate avec deux arguments est disponible depuis Java8, mais il était nécessaire de définir une condition d'arrêt avec limite etc.
IntStream.iterate(0, i -> i + 3).limit(5)
.forEach(System.out::println);
Je n'avais pas non plus takeWhile
, donc c'était assez difficile à utiliser.
Et maintenant, vous pouvez utiliser ʻiterate en combinaison avec
takeWhile`.
Vous pouvez donc l'utiliser comme une instruction for.
IntStream.iterate(0, i -> i < 10, i -> i + 3)
.forEach(System.out::println);
Si vous écrivez ceci de la manière suivante, il ne reviendra pas. Pensez pourquoi.
IntStream.iterate(0, i -> i < 10, i -> i++)
.forEach(System.out::println);
je peux le faire
IntStream.iterate(0, i -> i < 10, i -> ++i)
.forEach(System.out::println);
Optional/OptionalInt/OptionalLong/OptionalDouble orElseThrow() isEmpty() stream()
La conversion d'Optionnel en Stream n'a jamais été aussi simple.
Cela élimine le besoin d'insérer un filter (Optional :: isPresent)
quand un Optional revient dans un Stream.
Par exemple, si getById
renvoie facultatif
ids.map(Data::getById)
.filter(Optional::isPresent)
.collect(Collectors.toList())
Ce que je faisais
ids.flatMap(id -> getById(id).stream())
.collect(Collectors.toList())
Vous pourrez écrire avec flatMap comme ça.
ifPresentOrElse or
Si facultatif est vide, il est plus facile d'écrire quelque chose comme le suivant facultatif.
Collectors toUnmodifiableList / toUnmodifiableSet / toUnmodifiableMap
Collecteur qui stocke les valeurs dans des collections immuables
filtering flatMapping
Enumeration asIterator
Objects requireNonNullElse requireNonNullElseGet
java.io
Path of
Files writeString
Le processus d'écriture de texte dans un fichier se fait sur une seule ligne.
readString
Le processus de lecture de texte à partir d'un fichier se fait sur une seule ligne.
Reader transferTo
L'écriture du contenu lu par Reader tel qu'il est dans Writer est une ligne
nullReader Writer nullWriter
InputStream transferTo
L'écriture du contenu lu par InputStream tel quel dans OutputStream est une ligne
nullInputStream
OutputStream nullOutputStream
java.net.http
L'accès HTTP a été repensé.
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
Vous pouvez maintenant exécuter un code Java source unique avec des commandes java sans le compiler avec javac.
Module System
Java EE and CORBA is dropped
Recommended Posts