Java 12 est déjà entré dans la phase de Rampdown et ses fonctionnalités sont presque finalisées et sortiront le 19 mars si tout se passe bien. -> A été fait. Donc, je vais résumer les fonctions qui entrent Java 12 dans JEP, API et autres. JDK 12 Early-Access Builds
JEP Tout d'abord, les changements basés sur JEP qui résument les principales fonctions http://openjdk.java.net/projects/jdk/12/
Contient 8 JEP en tout. Les trois ci-dessus et le CDS par défaut sont susceptibles d'affecter le programmeur Java moyen. Malheureusement, les littéraux de chaîne bruts ont été supprimés. 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
J'écrirai sur chacun d'eux dans l'ordre dans lequel ils sont susceptibles d'être utilisés.
325: Switch Expressions (Preview)
L'instruction Switch a été étendue en tant que fonction d'aperçu et peut maintenant être utilisée comme expression. (Pour utiliser la fonction Aperçu, vous devez ajouter --enable-preview
à javac
etc.)
String time = switch (weekday) {
case MONDAY, FRIDAY -> "10:00-18:00";
case TUESDAY, THURSDAY -> "10:00-14:00";
default -> "vacances";
};
Cela ressemble à ça jusqu'à présent.
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 = "vacances";
}
Je pense que c'est le modèle la plupart du temps que vous utilisez switch
. Dans le commutateur conventionnel, bien sûr, la quantité de description est importante, mais cela a provoqué des bogues tels que l'omission de rupture, la mise à jour de la mauvaise variable et le fait de ne pas être garanti qu'il n'y a pas d'omission de mise à jour. Ce sera résolu, je voudrais donc l'utiliser activement.
En fait, il est divisé en trois spécifications supplémentaires.
Vous pouvez maintenant spécifier plusieurs valeurs pour «case».
String time;
switch (weekday) {
case MONDAY, FRIDAY:
time = "10:00-18:00";
break;
case TUESDAY, THURSDAY:
time = "10:00-14:00";
break;
default:
time = "vacances";
}
Rule Switch
En utilisant ->
, la pause n'est plus nécessaire.
String time;
switch (weekday) {
case MONDAY, FRIDAY -> time = "10:00-18:00";
case TUESDAY, THURSDAY -> time = "10:00-14:00";
default -> time = "vacances";
}
Vous pouvez également traiter plusieurs lignes à l'aide de blocs.
String time;
switch (weekday) {
case MONDAY, FRIDAY -> {
var endTime = getEndTime();
time = "10:00-" + endTime;
}
case TUESDAY, THURSDAY -> time = "10:00-14:00";
default -> time = "vacances";
}
Je veux utiliser cela de manière positive.
Et «switch» est devenu une expression.
Si vous n'utilisez pas la syntaxe de la flèche, ou si vous utilisez des blocs pour la syntaxe de la flèche, break
renvoie la valeur.
String time = switch (weekday) {
case MONDAY, FRIDAY -> {
var endTime = getEndTime();
break "10:00-" + endTime;
}
case TUESDAY, THURSDAY -> "10:00-14:00";
default -> "vacances";
};
Une erreur se produit si toutes les entrées ne peuvent pas être prises en charge.
jshell> switch("a"){ case "a" -> 3;}
|Erreur:
|l'expression de commutateur ne couvre pas toutes les valeurs d'entrée possibles
| switch("a"){ case "a" -> 3;}
| ^--------------------------^
Le «break» qui renvoie une valeur pourrait être «break-with» lorsqu'il est devenu officiel. Call for feedback -- enhanced switch Cependant, dans JDK 13, c'est "yield".
341: Default CDS Archives
Il existe un mécanisme pour créer des données de classe à l'avance et les partager, mais jusqu'à présent, il était nécessaire de créer des données de classe par vous-même en tant que java -Xshare: dump
.
Depuis JDK12, lib / server / classes.jsa
est inclus à l'avance, donc ce travail n'est pas nécessaire, et si -Xshare: auto
est la valeur par défaut dans JDK11 et que classes.jsa
existe, il sera automatique. Puisque CDS est utilisé dans, il semble que CDS soit utilisé depuis le début sans rien faire.
Cela devrait améliorer le temps de démarrage de Java.
189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) Il s'agit d'un GC développé par Red Hat. Il semble que l'heure d'arrêt ne change pas, qu'elle soit de 2 Go ou de 200 Go.
Comme il existe de nombreux codes en commun avec G1GC, il semble que G1GC pourrait être amélioré au cours du développement de Shenandoah. Ce JEP346 est également l'une des réflexions de telles améliorations dans le cadre du développement de Shenandoah dans G1GC. Parallel Full GC for G1 dans Java 10 semble être le même. InfoQ: L'avenir d'OpenJDK dans Red Hat
A propos, JDK11 contient également deux GC, ZGC et Epsillon. Ainsi, JDK12 contient 7 GC.
La valeur par défaut est de Java 9 à G1GC. JEP 248: Make G1 the Default Garbage Collector
Cependant, il semble que Parallel GC est utilisé dans les environnements à faible mémoire et Serial GC est utilisé dans les environnements monocœur.
Il semble préférable de ne pas utiliser ZGC avec un tas de 32 Go ou moins, donc je pense qu'il est utilisé quand il y a un tas de plusieurs centaines de Go à plusieurs To. Pourquoi ne pas utiliser correctement G1GC et Shenandoah?
CMS est obsolète depuis Java 9 et sera supprimé à l'avenir JEP 291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector
De plus, je pensais qu'Epsilon GC serait bien s'il commençait avec chaque requête comme sans serveur, mais quand j'ai essayé d'utiliser Epsilon GC avec un programme simple, c'était lent.
230: Microbenchmark Suite Il existe un framework de référence appelé JMH (Java Microbenchmark Harness?), Mais il semble qu'il soit désormais inclus dans le JDK. Pour synchroniser la maintenance? OpenJDK: jmh
Cependant, je n'ai pas pu trouver de matériel sur ce qui a changé par rapport à l'utilisation d'un JMH externe et comment l'utiliser.
334: JVM Constants API
Dynamic Class-File Constants est inclus dans Java 11 et Invoke Dynamic peut être utilisé pour le traitement au moment de l'initialisation de la classe. JEP 309: Dynamic Class-File Constants Cependant, aucune spécification de langue ou API n'a été ajoutée pour le moment, j'ai donc dû créer mon propre fichier de classe pour l'utiliser.
Le package java.lang.constant
a été ajouté, y compris l'interface Constable
et l'interface ConstantDesc
.
Et les classes telles que String
, ʻInteger,
Class et ʻEnum
qui ne sont pas utilisées comme constantes implémentent Constable
et implémentent la méthode describeConstable ()
.
346: Promptly Return Unused Committed Memory from G1 Renvoie la mémoire inutilisée en cas d'inactivité. Réflexion sur les changements de Shenandoah à G1GC.
344: Abortable Mixed Collections for G1
Rendre le GC mixte arrêtable. Je ne sais pas si cela vient de Shenandoah.
340: One AArch64 Port, Not Two Puisqu'il y avait deux codes source de arm64 et aarch64 comme port pour ARM64bit, il semble que arm64 a été supprimé pour éliminer la duplication du travail.
API Les modifications de l'API ne sont pas non plus flashy, et il semble qu'il y ait quelques corrections mineures.
CompactNumberFormat C'est un "NumberFormat" qui exprime un grand nombre, par exemple, 10 000 comme 10 000 ou 10 Ko. [JDK-8188147] Compact Number Formatting support - Java Bug System
L'instance est obtenue par la méthode getCompactNumberInstance
de java.text.NumberFormat
.
Dans le cas des paramètres régionaux japonais, cela ressemble à ceci. Il semble que Kyo n'est pas compatible avec jusqu'à des billions.
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 ==> "Cent millions"
jshell> cnf.format(10000_0000_0000L)
$6 ==> "1 billion"
jshell> cnf.format(10000_0000_0000_0000L)
$7 ==> "10 000 milliards"
Si vous spécifiez un paramètre régional, vous devez également spécifier un style. Vous pouvez choisir entre «COURT» ou «LONG».
Cela ressemble à ceci avec SHORT
.
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"
Il prend en charge jusqu'à T. N'est-ce pas 1 milliard de 1G? C'est comme ça. Précisons «LONG».
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"
Dans le cas de 1000, il semble que c'était le K de Kilo, mais M et T semblaient être des millions et des billions au lieu de Mega et Tera.
Si vous souhaitez afficher après la virgule décimale, utilisez setMaximumFractionDigit
ou setMinimumFractionDigit
.
Par défaut, les nombres après la virgule décimale sont arrondis.
jshell> cnf.format(123456)
$20 ==> "123 thousand"
Vous pouvez utiliser setMaximumFractionDigits
pour spécifier le nombre maximum de chiffres après la virgule décimale.
jshell> cnf.setMaximumFractionDigits(2)
jshell> cnf.format(123456)
$21 ==> "123.46 thousand"
jshell> cnf.format(123400)
$22 ==> "123.4 thousand"
Vous pouvez utiliser setMinimumFractionDigits
pour spécifier le nombre minimum de chiffres après la virgule décimale.
jshell> cnf.setMinimumFractionDigits(2)
jshell> cnf.format(123400)
$23 ==> "123.40 thousand"
String.indent(int) Ajoute des retraits pour le nombre de caractères spécifié.
jshell> "123\n456".indent(2)
$24 ==> " 123\n 456\n"
Vous pouvez réduire l'indentation en spécifiant une valeur négative.
jshell> " 123\n 123".indent(-2)
$25 ==> "123\n123\n"
C'est un vestige de Raw String Literals. [JDK-8200435] String::align, String::indent - Java Bug System
Le ʻalign () `qui a également été entré pour RSL reste dans ea27, mais il devrait disparaître dans ea28 car il y avait un commit de suppression. [JDK-8215490] Remove String::align - Java Bug System
String.transform(Function<String, R>)
Il s'agit également d'un vestige de littéraux de chaîne bruts.
Cela s'applique quand il y a une fonction qui reçoit String
et renvoie quelque chose.
Cependant, avec cela seul, je pense que je devrais simplement appeler la fonction normalement, mais comme motivation, je sens que je peux écrire dans l'ordre que je pense.
[JDK-8203703] String::transform - Java Bug System
Par exemple, supposons que vous ayez une fonction qui vous donne une adresse en passant un nom et une fonction qui vous donne la population en passant une adresse. Voici la carte.
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}
Et quand j'ai dit: «Je veux afficher la population de l'adresse de la personne lorsque je passe le nom», j'ai dû écrire quelque chose comme ça.
jshell> population.get(addresses.get(name))
$37 ==> 2000000
Bien qu'il s'agisse d'un processus consistant à "prendre un nom et prendre une adresse pour prendre la population", il faut écrire dans l'ordre de "passer le nom pour passer l'adresse pour renvoyer la population".
Cela peut être écrit comme suit en utilisant transform
.
jshell> name.transform(addresses::get).transform(population::get)
$38 ==> 2000000
L'ordre est "prenez l'adresse par son nom et prenez la population".
Il existe de nombreux langages dans lesquels «fonction (valeur)» peut être écrite dans l'ordre de «valeur → fonction» dans les spécifications du langage, mais pour le moment, il semble que Java l'ait réalisé.
J'aimerais pouvoir écrire dans l'ordre nom → adresse :: get → population :: get
en Java.
Collectors.teeing(Collector, Collector, BiFunction) Connectez les résultats des deux collecteurs. [JDK-8209685] Create Collector which merges results of two other collectors - Java Bug System
Par exemple, si vous avez une liste de chaînes et que vous souhaitez omettre les chaînes vides et les séparer par des virgules pour obtenir le nombre final d'éléments, vous ne pouvez pas le résoudre avec un seul processus Stream, mais vous pouvez maintenant le faire. Je vais.
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) Renvoie le premier des deux fichiers dans une position différente. -1 pour le même fichier J'ai ʻisSameFile`, mais ne voulez-vous pas quelque chose de différent? Il semble que cela ait été ajouté. [JDK-8202302](fs) New Files.mismatch method for comparing files - Java Bug System
InputStream.skipNBytes(long) Ignore le nombre d'octets et de données spécifié. [JDK-8214072] InputStream.skipNBytes(long k) to skip exactly k bytes - Java Bug System
Je pense qu'il y a un «skip (long)», mais «skip» renvoie le nombre réellement avancé, tandis que «skipNBytes» ne renvoie pas de valeur de retour et spécifie une valeur au-delà de la fin du flux. Ensuite, il lance ʻEOFException`.
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)
|Exception java.io.EOFException
| at InputStream.skipNBytes (InputStream.java:600)
| at (#29:1)
CompletableFuture.exceptionallyAsync(Function)
Les méthodes ʻexceptionallyAsync, ʻexceptionallyCompose
et ʻexceptionallyComposeAsync ont été ajoutées à
CompletableFuturepour gérer les exceptions. En fait, il a été ajouté à l'interface
CompletableStage`, donc on a l'impression qu'il a été implémenté.
[JDK-8211010] Add exception handling methods to CompletionStage and CompletableFuture - Java Bug System
Il existe déjà «exceptionnellement», mais des versions de composition et asynchrone ont été ajoutées.
Changements de système que je peux faire. Ce type de refactoring est également souvent inclus. [JDK-8214971] Replace use of string.equals("") with isEmpty() - Java Bug System
La commande jfr a été ajoutée.
$ jfr print --categories GC --events CPULoad recording.jfr
Il semble être utilisé comme [JDK-8205517] JFR tool - Java Bug System
Recommended Posts