Résumé des nouvelles fonctionnalités de Java 12

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.

Cas multiples

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.

Type de commutateur

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'interfaceCompletableStage`, 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.

str.equals ("") à str.isEmpty ()

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

Autre

Outil d'enregistrement de vol Java

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

Résumé des nouvelles fonctionnalités de Java 12
Résumé des nouvelles fonctionnalités de Java 13
Résumé des nouvelles fonctionnalités de Java 10
Résumé des nouvelles fonctionnalités de Java 14
Java EE 8 (Jakarta EE 8) Résumé des nouvelles fonctionnalités
Résumé des connaissances Java
Résumé des génériques Java
Résumé relatif à Java
java1.8 nouvelles fonctionnalités
Résumé du document Java 8
Résumé du document Java 11
[Résumé] Par exemple, préparation de l'environnement Java
3ème résumé efficace de Java
Java statique [Résumé personnel]
Fonctionnalité d'expression lambda Java 8
Résumé des threads sûrs ~ Java ~
Résumé de la spécialisation des primitives Java
Résumé du lien de développement Java
Résumé personnel sur Java
Nouveautés de Java 8
Récapitulatif de la nouvelle fonction JSF2.3
résumé des expressions régulières java
Nouveautés de Java 9,10,11
Résumé du support Java 2018
Résumé du modèle de conception Java
Résumé du mot réservé Java
Résumé approximatif du flux Java8
Résumé des révisions (nouveaux problèmes de yuan) par version Java
Qu'est-ce que l'assertion Java? Résumé.
[Java] Nouvelle méthode de génération de threads (2)
[Java11] Résumé du flux -Avantages du flux-
Révision et résumé de Progate Java (débutant)
Nouvelles fonctionnalités de Java7 à Java8
[Java] Résumé des expressions régulières
[Java] Résumé des opérateurs (opérateur)
Flux Java8, résumé de l'expression lambda
Résumé orienté objet par les débutants (Java)
Résumé des bases du langage Java
Astuces Java - Résumé de l'exécution de Spring
Résumé de la classe Java Math
Résumé des nouvelles fonctionnalités de PrimeFaces 6.0.x
[Java11] Résumé de l'utilisation du flux -Basics-
[Java] Résumé de la syntaxe de contrôle
Résumé du traitement des erreurs Java
[Java] Résumé des modèles de conception
[Java] Nouvelle méthode de génération de threads (1)
[Java] Résumé des opérations mathématiques
Nouvelle syntaxe pour les instructions Java 12 Switch
Considération sur le cadre de persistance Java 2017 (résumé) -1
[Pour les débutants] Résumé du constructeur java
Date de sortie de Java et résumé EOL
Résumé du package [Java Silver Study]
Nouvelles fonctionnalités de Java 9 et exemple de code
Résumé
Résumé de l'algorithme AtCoder 400 points (édition Java)
Java
Récapitulatif du problème Java "Pass by Reference"
Java
Résumé de la programmation orientée objet utilisant Java
Essayez Eclipse 4.7 Oxygen New 30+ / Java 10 var!