{"id":652,"date":"2017-03-27T15:29:29","date_gmt":"2017-03-27T13:29:29","guid":{"rendered":"http:\/\/www.loicmathieu.fr\/wordpress\/?p=652"},"modified":"2020-05-06T10:15:03","modified_gmt":"2020-05-06T08:15:03","slug":"les-nouveautes-de-java-9-pour-les-developeurs","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/","title":{"rendered":"Les nouveaut\u00e9s de java 9 pour les d\u00e9veloppeurs"},"content":{"rendered":"<p>Maintenant que Java 9 est Features Complete, il est temps de se pencher sur toutes les nouveaut\u00e9s que cette nouvelle version va nous apporter, \u00e0 nous, d\u00e9velopeurs utilisant java.<\/p>\n<p>Bien sur, tout le monde a entendu parler de la modularisation du JDK (project Jigsaw) attendu depuis tr\u00e8s longtemps. Et bien, je ne vais pas en parler ici! Je vais m&rsquo;attacher aux nouveaut\u00e9s de Java 9 qui sont \u00e0 destination des d\u00e9velopeurs lambda, pas celles \u00e0 destination des auteurs de framework ou des utilisateurs avanc\u00e9s.<\/p>\n<p>Tout d&rsquo;abord, le d\u00e9velopement de Java 9 a \u00e9t\u00e9 principalement r\u00e9alis\u00e9 via un ensemble de JEP (Java Enhancement Proposal, plus d&rsquo;info ici : <a href=\"http:\/\/openjdk.java.net\/jeps\/1\"><a href=\"http:\/\/openjdk.java.net\/jeps\/1\">http:\/\/openjdk.java.net\/jeps\/1<\/a><\/a>) dont on peut trouver la liste ici : <a href=\"http:\/\/openjdk.java.net\/projects\/jdk9\/\"><a href=\"http:\/\/openjdk.java.net\/projects\/jdk9\/\">http:\/\/openjdk.java.net\/projects\/jdk9\/<\/a><\/a>. De toutes ces JEPs, je vais parcourir celles qui contiennent des changements visibles et utilisables dans la vie de tout les jours des d\u00e9veloppeurs.<\/p>\n<h2>JEP 102: Process API Updates<\/h2>\n<p>Gerer depuis java l&rsquo;appel a un programme (process) externe a toujours \u00e9t\u00e9 compliqu\u00e9. Surtout si on veut faire des op\u00e9rations qui semblent basique mais qui n&rsquo;ont pas \u00e9t\u00e9 pr\u00e9vue dans l&rsquo;impl\u00e9mentation actuelle (r\u00e9cup\u00e9rer le PID, killer un process, r\u00e9cup\u00e9rer la ligne de commande, &#8230;).<\/p>\n<p>Via le <a href=\"http:\/\/openjdk.java.net\/jeps\/102\">JEP 102 : Process API Updates<\/a>, l&rsquo;API Process a \u00e9t\u00e9 grandement am\u00e9lior\u00e9e pour permettre toutes ces op\u00e9rations, sur le process de la JVM (ProcessHandle.current()), ou un process fils cr\u00e9er via Runtime.getRuntime().exec(\u00ab\u00a0your_cmd\u00a0\u00bb). De plus, comme toujours avec java, c&rsquo;est compatible avec les diff\u00e9rents OS support\u00e9s par Java (et donc avec Windows ET Linux !).<\/p>\n<p>En voici quelques exemples d&rsquo;utilisations en Java 9:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ Get PIDs of own processes\nSystem.out.println(\"Your pid is \" + ProcessHandle.current().getPid());\n\n\/\/start a new process and get PID\nProcess p = Runtime.getRuntime().exec(\"sleep 1h\");\nProcessHandle h = ProcessHandle.of(p.getPid()).orElseThrow(IllegalStateException::new);\n\n\/\/ Do things on exiting process : CompletableFuture !\nh.onExit().thenRun( () -&gt; System.out.println(\"Sleeper exited\") );\n\n\/\/ Get info on process : return Optional!\nSystem.out.printf(\"[%d] %s - %s\\n\", h.getPid(), h.info().user().orElse(\"unknown\"), \nh.info().commandLine().orElse(\"none\"));\n\n\/\/ Kill a process\nh.destroy();\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>JEP 110: HTTP\/2 Client (Incubator)<\/h2>\n<p>HTTP\/2 est l\u00e0, et beaucoup de site l&rsquo;exploitent d\u00e9j\u00e0. Il \u00e9tait temps que Java en propose une impl\u00e9mentation cliente. Au passage, l&rsquo;API a \u00e9t\u00e9 revue pour proposer une impl\u00e9mentation plus simple \u00e0 utiliser que la tr\u00e8s ancienne <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/net\/HttpURLConnection.html\">HttpURLConnection<\/a>&nbsp;qui jusqu&rsquo;ici \u00e9t\u00e9 la seule mani\u00e8re de faire des appels HTTP en Java dans le JDK (et la raison pour laquelle les d\u00e9velopeurs utilisaient des librairies tierces tels que Apache HttpClient ou OKHttp). Avec la <a href=\"http:\/\/openjdk.java.net\/jeps\/110\">JEP 110: HTTP\/2 Client (Incubator)<\/a> Java se dote d&rsquo;un client HTTP au go\u00fbt du jour, synchrone ou asynchrone (il est alors bas\u00e9 sur les <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\">CompletableFuture<\/a>).<\/p>\n<p>En voici un exemple en utilisation asynchrone :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/**\n * The HTTP API functions asynchronously and synchronously. In asynchronous mode, work is done in threads (ExecutorService).\n *\/\npublic static void main(String[] args) throws Exception {\n  HttpClient.getDefault()\n    .request(URI.create(\"http:\/\/www.loicmathieu.fr\"))\n    .GET()\n    .responseAsync() \/\/ CompletableFuture\n    .thenAccept(httpResponse -&gt;\n        System.out.println(httpResponse.body(HttpResponse.asString()))\n    );\n  Thread.sleep(999); \/\/ Give worker thread some time.\n}\n<\/pre>\n<h2>JEP 259: Stack-Walking API<\/h2>\n<p>Parcourir une stack d&rsquo;execution en Java n&rsquo;a jamais \u00e9t\u00e9 facile &#8230; c&rsquo;est d\u00e9sormais du pass\u00e9, gr\u00e2ce \u00e0 la Stack-Walking API :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/259\"><a href=\"http:\/\/openjdk.java.net\/jeps\/259\">http:\/\/openjdk.java.net\/jeps\/259<\/a><\/a><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ return class\/method only for our classes.\nprivate static List walkAndFilterStackframe() {\n  return StackWalker.getInstance().walk(s -&gt;\n    s.map( frame -&gt; frame.getClassName() + \"\/\" + frame.getMethodName())\n           .filter(name -&gt; name.startsWith(\"fr.loicmathieu\"))\n           .limit(10)\n           .collect(Collectors.toList()) );\n}\n<\/pre>\n<h2>JEP 269: Convenience Factory Methods for Collections<\/h2>\n<p>La JEP 269 apporte un des plus grand changement en terme d&rsquo;API : des m\u00e9thodes statiques sur les interfaces de l&rsquo;API Collection pour la cr\u00e9ation facilit\u00e9e de collection immuable. Plus d&rsquo;info ici :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/269\"><a href=\"http:\/\/openjdk.java.net\/jeps\/269\">http:\/\/openjdk.java.net\/jeps\/269<\/a><\/a>. La cible est la cr\u00e9ation de petite collections (list, set, map). La performance et l&rsquo;utilisation m\u00e9moire ont \u00e9t\u00e9 au centre de l&rsquo;impl\u00e9mentation de ces collections.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nList listOfNumbers = List.of(1, 2, 3, 4, 5);\n\nSet setOfNumbers = Set.of(1, 2, 3, 4, 5);\n\nMap mapOfString =\n    Map.of(\"key1\", \"value1\", \"key2\", \"value2\");\n\nMap moreMapOfString =\n    Map.ofEntries(\n        Map.entry(\"key1\", \"value1\"),\n        Map.entry(\"key2\", \"value2\"),\n        Map.entry(\"key1\", \"value3\")\n);\n<\/pre>\n<h2>JEP 266: More Concurrency Updates<\/h2>\n<p>La <a href=\"http:\/\/openjdk.java.net\/jeps\/266\">JEP 266: More Concurrency Updates<\/a> comme son nom ne l&rsquo;indique pas, contient une des \u00e9volutions majeur de Java 9 : une impl\u00e9mentation des <a href=\"http:\/\/www.reactive-streams.org\/\">Reactive Stream<\/a> en Java via la classe Flow. Java va alors rejoindre le groupe tr\u00e8s hype des languages r\u00e9actifs!<\/p>\n<p>La classe <a href=\"http:\/\/download.java.net\/java\/jdk9\/docs\/api\/java\/util\/concurrent\/Flow.html\">Flow<\/a> propose donc trois interfaces pour impl\u00e9menter vos stream r\u00e9actives :<\/p>\n<ul><li><code>Publisher : <\/code>Produit des messages que les subscriber vont consomer. La seule methode est\u00a0<code>subscribe(Subscriber).<\/code><\/li>\n\n<li><code>Subscriber :&nbsp;<\/code>Souscrit a un publisher pour recevoir des messages (via la methode\u00a0<code>onNext(T)<\/code>), des messages d&rsquo;erreur (<code>onError(Throwable)<\/code>), ou un signal comme quoi il n&rsquo;y aura plus de messages\u00a0(<code>onComplete()<\/code>). Avant toute chose, le publisher doit appeler\u00a0<code>onSubscription(Subscription)<\/code>.<\/li>\n\n<li><code>Subscription :&nbsp;<\/code>La connexion entre un publisher et un subscriber. Le subscriber va l&rsquo;utiliser pour demander des messages\u00a0(<code>request(long)<\/code>) ou pour rompre la connexion\u00a0(<code>cancel()<\/code>).<\/li>\n<\/ul>\n<p>Voici un exemple tir\u00e9 du tutoriel disponible <a href=\"https:\/\/community.oracle.com\/docs\/DOC-1006738\">ici<\/a> :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class MySubscriber implements Subscriber {  \n  private Subscription subscription;  \n\n  @Override  \n  public void onSubscribe(Subscription subscription) {  \n    this.subscription = subscription;  \n    subscription.request(1); \/\/a value of Long.MAX_VALUE may be considered as effectively unbounded  \n  }  \n\n  @Override  \n  public void onNext(T item) {  \n    System.out.println(\"Got : \" + item);  \n    subscription.request(1); \/\/a value of Long.MAX_VALUE may be considered as effectively unbounded  \n  }  \n\n  @Override  \n  public void onError(Throwable t) {  \n    t.printStackTrace();  \n  }  \n\n  @Override  \n  public void onComplete() {  \n    System.out.println(\"Done\");  \n  }  \n}  \n<\/pre>\n<p>Et voici un exemple de Publisher<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n    \/\/Create Publisher  \n    SubmissionPublisher publisher = new SubmissionPublisher();  \n\n    \/\/Register Subscriber  \n    MySubscriber subscriber = new MySubscriber();  \n    publisher.subscribe(subscriber);  \n\n    \/\/Publish items  \n    System.out.println(\"Publishing Items...\");  \n    String[] items = {\"1\", \"x\", \"2\", \"x\", \"3\", \"x\"};  \n    Arrays.asList(items).stream().forEach(i -&gt; publisher.submit(i));  \n    publisher.close();  \n<\/pre>\n<p>De plus, quelques changement \u00e0 l&rsquo;API CompletableFuture (sorte d&rsquo;\u00e9quivalent des Promise JavaScript en Java) ont vu le jour permettant, entre autre, une meilleur composition des CompletableFuture entre elle :<\/p>\n<ul><li>copy():CompletableFuture<\/li>\n\n<li>completeAsync\u200b(Supplier supplier):CompletableFuture<\/li>\n\n<li>orTimeout\u200b(long timeout,TimeUnit unit):CompletableFuture<\/li>\n\n<li>completeOnTimeout\u200b(T value, long timeout, TimeUnit unit):CompletableFuture<\/li>\n\n<li>failedFuture\u200b(Throwable ex):CompletableFuture<\/li>\n<\/ul>\n<p>Pour la liste exaustive des nouvelles m\u00e9thodes, voir les m\u00e9thodes \u00ab\u00a0<strong><em>Since 9<\/em><\/strong>\u00a0\u00bb de la javadoc : <a href=\"http:\/\/download.java.net\/java\/jdk9\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\"><a href=\"http:\/\/download.java.net\/java\/jdk9\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\">http:\/\/download.java.net\/java\/jdk9\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html<\/a><\/a><\/p>\n<h2>JEP 277: Enhanced Deprecation<\/h2>\n<p>La <a href=\"http:\/\/openjdk.java.net\/jeps\/277\">JEP 277: Enhanced Deprecation<\/a> permet de pr\u00e9ciser via l&rsquo;annotation <a>@Deprecated<\/strong>strong&gt;@Deprecated&lt;\/strong<\/a> deux attributs essentiels qui permettent aux d\u00e9veloppeurs d&rsquo;avoir connaissance de si l&rsquo;API utilis\u00e9e est destin\u00e9e \u00e0 \u00eatre supprim\u00e9e et quand la deprecation a \u00e9t\u00e9 mise. Ceci dans le but de faciliter le cycle de vie des applications et de permettre, peut-\u00eatre plus sereinement, de supprimer dans le futur certaines API du JDK lui-m\u00eame.<\/p>\n<p>Voici un petit exemple qui pr\u00e9cise que MyDeprecatedClass est d\u00e9pr\u00e9ci\u00e9 depuis la version 10 et sera supprim\u00e9 un jour :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n@Deprecated(since=\"9\", forRemoval=true)\npublic class MyDeprecatedClass {\n    \/\/deprecated stuff\n}\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>JEP 222: jshell: The Java Shell (Read-Eval-Print Loop)<\/h2>\n<p>Beaucoup de languages (ruby, scala, python, &#8230;) proposent une Read-Evaluate-Print-Loop (REPL), un shell.&nbsp;Cel\u00e0 permet un apprentissage ais\u00e9 du language et donne une porte d&rsquo;entr\u00e9 direct depuis un simple shell. Que \u00e7a soit pour introduire le language, prototyper ou tester c&rsquo;est toujours un plus d&rsquo;avoir un shell et d&rsquo;\u00e9viter le c\u00e9r\u00e9monial d&rsquo;\u00e9dition, de compilation, de packaging du code.<\/p>\n<p>Avec Java 9, apparait <strong>jshell<\/strong>, le REPL de java ! Plus d&rsquo;info dans la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/222\"><a href=\"http:\/\/openjdk.java.net\/jeps\/222\">http:\/\/openjdk.java.net\/jeps\/222<\/a><\/a><\/p>\n<p>Depuis une ligne de commande, ex\u00e9cutez <strong>\/bin\/jshell<\/strong> et laissez vous guider par l&rsquo;aide (\/help). Exemple ci-dessous :<\/p>\n<figure id=\"attachment_678\" aria-describedby=\"caption-attachment-678\" style=\"width: 502px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-678\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/jshell.png?resize=502%2C353\" alt=\"jshell the Java REPL\" width=\"502\" height=\"353\" srcset=\"https:\/\/i0.wp.com\/www.loicmathieu.fr\/wordpress\/wp-content\/uploads\/jshell.png?w=502&amp;ssl=1 502w, https:\/\/i0.wp.com\/www.loicmathieu.fr\/wordpress\/wp-content\/uploads\/jshell.png?resize=300%2C211&amp;ssl=1 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><figcaption id=\"caption-attachment-678\" class=\"wp-caption-text\">jshell the Java REPL<\/figcaption><\/figure>\n<p>Un article qui rentre plus en d\u00e9tail : <a href=\"http:\/\/jakubdziworski.github.io\/java\/2016\/07\/31\/jshell-getting-started-examples.html\"><a href=\"http:\/\/jakubdziworski.github.io\/java\/2016\/07\/31\/jshell-getting-started-examples.html\">http:\/\/jakubdziworski.github.io\/java\/2016\/07\/31\/jshell-getting-started-examples.html<\/a><\/a><\/p>\n<h2>JEP 213: Milling Project Coin<\/h2>\n<p>Project Coin est un projet d&rsquo;\u00e9volution du language, qui a d\u00e9but\u00e9 avec java 7 dans le but de simplifier l&rsquo;utilisation du language pour les d\u00e9veloppeurs en apportant des petites modifications de l&rsquo;ordre du \u00ab\u00a0sucre syntaxique\u00a0\u00bb. La <a href=\"http:\/\/openjdk.java.net\/jeps\/213\">JEP213 : Milling Project Coin<\/a> contient l&rsquo;impl\u00e9mentation dans Java 9 des derni\u00e8res partie du projet.<\/p>\n<ul><li><strong>@SafeVarargs<\/strong> autoris\u00e9 sur une m\u00e9thode priv\u00e9 (pr\u00e9c\u00e9demment uniquement dans les m\u00e9thodes static ou finale)<\/li>\n\n<li>Autorisation de l&rsquo;op\u00e9rateur  pour les classes abstraite (quand le type est d\u00e9notable)<\/li>\n\n<li>Suppression de &lsquo;_&rsquo; comme un identificateur valide pour permettre sa r\u00e9utilisation en Java 10 (traditionnelement utilis\u00e9 pour nommer un attribut, en cas de surchage de m\u00e9thode, qu&rsquo;on ne veut pas utiliser)<\/li>\n\n<li>M\u00e9thode priv\u00e9 dans les interfaces : permet la factorisation de code de m\u00e9thode statique (factorisation de code entre deux m\u00e9thodes statiques de la m\u00eame interface)<\/li>\n\n<li>Autorisation des variables finale (ou effectivement finale) dans un try-with-resource (exemple ci-dessous) :<\/li>\n<\/ul>\n<p><strong>Avant Java 9:&nbsp;<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nfinal Resource r = new Resource(); \ntry (Resource r2 = r) { \u2026 }\n<\/pre>\n<p><strong>En Java 9&nbsp;:<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nfinal Resource r = new Resource(); \ntry (r) { \u2026 \/\/ Cannot mutate r }\n<\/pre>\n<h2>JEP 211 : Elide Deprecation Warnings on Import Statements<\/h2>\n<p>Avant : importer une classe d\u00e9pr\u00e9ci\u00e9e g\u00e9n\u00e9rait un warning \u00e0 la compilation, apr\u00e8s &#8230; plus de warning. Plus d&rsquo;info ici : <a href=\"http:\/\/openjdk.java.net\/jeps\/211\"><a href=\"http:\/\/openjdk.java.net\/jeps\/211\">http:\/\/openjdk.java.net\/jeps\/211<\/a><\/a><\/p>\n<h2>Pleins d&rsquo;autres changements hors\u00a0JEP :<\/h2>\n<h3>Stream &amp; Collectors:<\/h3>\n<ul><li><strong>Stream.takeWhile(Predicate predicate):Stream<\/strong> : construit une stream qui contient les \u00e9l\u00e9ments de la premi\u00e8re tant que le pr\u00e9dicat est vrai. D\u00e8s que le pr\u00e9dicat devient faux la stream est coup\u00e9e.<\/li>\n\n<li><strong>Stream.dropWhile(Predicate predicate):Stream<\/strong> : l&rsquo;inverse de takeWhile, construit une stream qui contient le premier \u00e9l\u00e9ment faux puis les suivants. Tant que le pr\u00e9dicat est faux : supprime les \u00e9m\u00e9lments, d\u00e8s qu&rsquo;il est vrai, inclue les \u00e9l\u00e9ments dans la stream.<\/li>\n\n<li><strong>Stream.ofNullable(T element):Stream<\/strong> : retourne une stream avec l&rsquo;\u00e9l\u00e9ment ou une stream vide si l&rsquo;\u00e9l\u00e9ment est nulle. Evite l&rsquo;utilisation d&rsquo;Optional avec les stream<\/li>\n\n<li><strong>Stream.iterate\u200b(T, Predicate, UnaryOperator)<\/strong> : r\u00e9plique une boucle for standard : Stream.iterate(0; i -&gt; i i+1)<\/li>\n\n<li><strong>Collectors.filtering(Predicate,Collector)<\/strong> : execute un filtre en amont du collector (voir un exemple dans la Javadoc qui explique la diff\u00e9rence avec l&rsquo;utilisation de Stream.filter() avant l&rsquo;utilisation d&rsquo;un collector)<\/li>\n\n<li><strong>Collectors.flatMapping\u200b(Function&gt;,Collector)<\/strong> : execute une operation de type flatMap en amont du collector (voir un exemple concret dans la Javadoc)<\/li>\n<\/ul>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/iterate\n\/java 8 style : using for loop\nfor (int i = 0; i  i  i + 1).forEach(System.out::println);\n\n\/\/takeWhile and dropWhile\nStream stream = Stream.iterate(\"\", s -&gt; s + \"s\")\nstream.takeWhile(s -&gt; s.length()  !s.contains(\"sssss\"));\n\n\/\/ofNullable : returning Stream.empty() for null element\n\/\/java 8 style : we need to make a check to know if it's null or not\ncollection.stream()\n  .flatMap(s -&gt; {\n      Integer temp = map.get(s);\n      return temp != null ? Stream.of(temp) : Stream.empty();\n  })\n  .collect(Collectors.toList());\n\n\/\/java 9 style\ncollection.stream().flatMap(s -&gt; Stream.ofNullable(map.get(s))).collect(Collectors.toList());\n<\/pre>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nList numbers = List.of(1, 2, 3, 5, 5);\n\nMap result = numbers.stream()\n    .filter(val -&gt; val &gt; 3)\n    .collect(Collectors.groupingBy(i -&gt;; i, Collectors.counting()));\n\nresult = numbers.stream()\n    .collect(Collectors.groupingBy(i -&gt; i, \n        Collectors.filtering(val -&gt; val &gt; 3, Collectors.counting())\n    ));\n<\/pre>\n<p>Un article sur le sujet : <a href=\"http:\/\/www.baeldung.com\/java-9-stream-api\"><a href=\"http:\/\/www.baeldung.com\/java-9-stream-api\">http:\/\/www.baeldung.com\/java-9-stream-api<\/a><\/a><\/p>\n<h3>Optional<\/h3>\n<p>4 nouvelles m\u00e9thodes ont \u00e9t\u00e9 ajout\u00e9e \u00e0 la classe Optional :<\/p>\n<ul><li><strong>or(Supplier):Optional<\/strong> : retourne le m\u00eame Optional ou un Optional construit avec le Supplier pass\u00e9 en param\u00e8tre si il n&rsquo;y a pas de valeur. Cela permet une construction lazy d&rsquo;un autre Optional si la valeur du premier n&rsquo;existe pas.<\/li>\n\n<li><strong>ifPresent(Consumer):void<\/strong> : execute le Consumer en param\u00e8tre s&rsquo;il y a une valeur de pr\u00e9sente<\/li>\n\n<li><strong>ifPresentOrElse(Consumer, Runnable):void<\/strong> : execute le Consumer en param\u00e8tre s&rsquo;il y a une valeur de pr\u00e9sente sinon execute le Runnable<\/li>\n\n<li><strong>stream():Stream<\/strong> : retourne un Stream d&rsquo;un element s&rsquo;il y a une valeur ou un Stream vide. Cela permet l&rsquo;utilisation de l&rsquo;API Stream avec les Optional.<\/li>\n<\/ul>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/Optional.or : a lazy version of orElse\nOptional value = ...;\nOptional defaultValue = Optional.of(() -&gt; bigComputation());\nreturn value.or(defaultValue);\/\/bigComputation will be called only if value is empty\n\n\/\/Optional.ifPresent : \nOptional value = ...;\nAtomicInteger successCounter = new AtomicInteger(0);\nvalue.ifPresent(\n      v -&gt; successCounter.incrementAndGet());\n\n\/\/Optional.ifPresentOrElse : \nOptional value = ...;\nAtomicInteger successCounter = new AtomicInteger(0);\nAtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);\nvalue.ifPresentOrElse(\n      v -&gt; successCounter.incrementAndGet(), \n      onEmptyOptionalCounter::incrementAndGet);\n\n\/\/Optional.stream : unify the stream and Optional API\nOptional value = Optional.of(\"a\");\nList collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); \/\/[\"A\"]\n<\/pre>\n<p>Un article sur le sujet : <a href=\"http:\/\/www.baeldung.com\/java-9-optional\"><a href=\"http:\/\/www.baeldung.com\/java-9-optional\">http:\/\/www.baeldung.com\/java-9-optional<\/a><\/a><\/p>\n<h3>Java Time :<\/h3>\n<p>Plusieurs ajouts \u00e0 l&rsquo;API Java Time, entre autre la possibilit\u00e9 de cr\u00e9er un Stream de&nbsp;date avec&nbsp;<strong>LocalDate.datesUntil(LocalDate)<\/strong> and<strong> LocalDate.datesUntil(LocalDate,Period<\/strong>) .<\/p>\n<p>Plus d&rsquo;info ici : <a href=\"http:\/\/blog.joda.org\/2017\/02\/java-time-jsr-310-enhancements-java-9.html\"><a href=\"http:\/\/blog.joda.org\/2017\/02\/java-time-jsr-310-enhancements-java-9.html\">http:\/\/blog.joda.org\/2017\/02\/java-time-jsr-310-enhancements-java-9.html<\/a><\/a><\/p>\n<h3>Autre :<\/h3>\n<ul><li><strong>InputStream.readAllBytes():byte[]<\/strong> : lit d&rsquo;un seul coup un input stream en tableau de byte<\/li>\n\n<li><strong>InputStream.readNBytes(byte[] b, int off, int len):int<\/strong> : lit d&rsquo;un seul coup un input stream dans le tableau de byte en param\u00e8tre avec offset et limite.<\/li>\n\n<li><strong>Objects.requireNonNullElse(T obj, T defaultObj)<\/strong> : retourne le premier \u00e9l\u00e9ments si non null, sinon le deuxi\u00e8me. Si les deux sont null : NullPointerException !<\/li>\n\n<li><strong>Objects.requireNonNullElseGet(T obj, Supplier supplier)<\/strong> \u00a0: retourne le premier \u00e9l\u00e9ments si non null, sinon appel le supplier.get().<\/li>\n\n<li><strong>int Objects.checkIndex(int index, int length)<\/strong> : check de l&rsquo;index : g\u00e9n\u00e8re un IndexOutOfBoundsException si l&rsquo;index est inf\u00e9rieur \u00e0 0 ou sup\u00e9rieur ou \u00e9agle \u00e0 la taille. Cette m\u00e9thode peut-\u00eatre optimis\u00e9e par le JVM.<\/li>\n\n<li><strong>int Objects.checkFromToIndex(int fromIndex, int toIndex, int length)<\/strong> : idem mais pour le sous-range fromIndex\/toIndex<\/li>\n\n<li><strong>int Objects.checkFromIndexSize(int fromIndex, int size, int length)<\/strong> : idem mais pour le sous-range fromIndex\/fromIndex + size<\/li>\n\n<li><strong>{Math, StrictMath}.fma()<\/strong> : impl\u00e9mentation de l&rsquo;op\u00e9ration fused-multiply-accumulate (fma)<\/li>\n\n<li><strong>{Math, StrictMath}.{multiplyExact, floorDiv, floorMod}<\/strong><\/li>\n\n<li><strong>{BigDecimal, BigInteger}. sqrt()<\/strong> : racine carr\u00e9<\/li>\n\n<li><strong>Arrays.equals(), Arrays.compare(), Arrays.compareUnsigned(), Arrays.mismatch()<\/strong> : beaucoup de nouvelles m\u00e9thodes permettant de comparer des tableaux dans plein de variantes : sign\u00e9e, non sign\u00e9es, avec from\/to index, \u00e9galit\u00e9, diff\u00e9rence, &#8230;<\/li>\n<\/ul>\n<h2>Performance\u00a0:<\/h2>\n<p>Les JEP suivantes sont ax\u00e8s sur la performance de la JVM, je ne les pr\u00e9senterais pas en d\u00e9tail ici (mais certainement dans un prochain article) mais en voici la liste :<\/p>\n<ul><li><a href=\"http:\/\/openjdk.java.net\/jeps\/143\">JEP 143: Improve Contended Locking<\/a> : optimisation des monitors Java (optimisation des lock).<\/li>\n\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/193\">JEP 193: Variable Handles<\/a>\u00a0: C++ atomics &#8230;<\/li>\n\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/197\">JEP 197: Segmented Code Cache<\/a>\u00a0: le code cache (une partie du Metaspace) a \u00e9t\u00e9 s\u00e9par\u00e9 pour en optimiser les performances.<\/li>\n\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/254\">JEP 254: Compact Strings<\/a>\u00a0: revue de l&rsquo;impl\u00e9mentation des String en Java pour en proposer une version plus compact en cas de Sring ISO-8859-1 (ou Latin-1). Les String Java sont stock\u00e9e en UTF-16 par d\u00e9faut : chaque caract\u00e8re est alors stock\u00e9 sur deux octets. A la cr\u00e9ation de la String, si elle est comptabile\u00a0ISO-8859-1 elle sera stock\u00e9 de mani\u00e8re compacte avec un caract\u00e8re sur un byte.<\/li>\n\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/274\">JEP 274: Enhanced Method Handles<\/a>\u00a0: plusieurs ajout \u00e0 l&rsquo;API MethodHandle<\/li>\n\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/280\">JEP 280: Indify String Concatenation<\/a>\u00a0: <strong><em>intrasification<\/em> <\/strong>de la concat\u00e9nation des cha\u00eenes de caract\u00e8re dans le JVM. Plusieurs start\u00e9gies de concat\u00e9nation de cha\u00eenes ont \u00e9t\u00e9 cod\u00e9es dont une \u00e0 base de Method Handles (avec StringBuilder ou en inline), c&rsquo;est celle par d\u00e9faut dor\u00e9navant.<\/li>\n\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/285\">JEP 285: Spin-Wait Hints<\/a>\u00a0: pour les utilisateurs bas niveau uniquement : possibilit\u00e9 de pr\u00e9ciser \u00e0 la JVM qu&rsquo;on est dans une spin-wait-loop &#8230;<\/li>\n<\/ul>\n<h2>Liens :<\/h2>\n<p>Voici les articles qui m&rsquo;ont inspir\u00e9s pour la r\u00e9daction de celui-ci :<\/p>\n<p><a href=\"https:\/\/blogs.oracle.com\/darcy\/resource\/Devoxx\/DevoxxUS-2017-jdk9-lang-tools-libs.pdf\"><a href=\"https:\/\/blogs.oracle.com\/darcy\/resource\/Devoxx\/DevoxxUS-2017-jdk9-lang-tools-libs.pdf\">https:\/\/blogs.oracle.com\/darcy\/resource\/Devoxx\/DevoxxUS-2017-jdk9-lang-tools-libs.pdf<\/a><\/a>\n<a href=\"http:\/\/docs.oracle.com\/javase\/9\/whatsnew\/toc.htm#JSNEW-GUID-BA9D8AF6-E706-4327-8909-F6747B8F35C5\"><a href=\"http:\/\/docs.oracle.com\/javase\/9\/whatsnew\/toc.htm#JSNEW-GUID-BA9D8AF6-E706-4327-8909-F6747B8F35C5\">http:\/\/docs.oracle.com\/javase\/9\/whatsnew\/toc.htm#JSNEW-GUID-BA9D8AF6-E706-4327-8909-F6747B8F35C5<\/a><\/a>\n<a href=\"http:\/\/blog.takipi.com\/5-features-in-java-9-that-will-change-how-you-develop-software-and-2-that-wont\/\"><a href=\"http:\/\/blog.takipi.com\/5-features-in-java-9-that-will-change-how-you-develop-software-and-2-that-wont\/\">http:\/\/blog.takipi.com\/5-features-in-java-9-that-will-change-how-you-develop-software-and-2-that-wont\/<\/a><\/a>\n<a href=\"https:\/\/bentolor.github.io\/java9-in-action\"><a href=\"https:\/\/bentolor.github.io\/java9-in-action\">https:\/\/bentolor.github.io\/java9-in-action<\/a><\/a>\n<a href=\"http:\/\/www.javaworld.com\/article\/2598480\/core-java\/why-developers-should-get-excited-about-java-9.html\"><a href=\"http:\/\/www.javaworld.com\/article\/2598480\/core-java\/why-developers-should-get-excited-about-java-9.html\">http:\/\/www.javaworld.com\/article\/2598480\/core-java\/why-developers-should-get-excited-about-java-9.html<\/a><\/a>\n<a href=\"https:\/\/www.sitepoint.com\/ultimate-guide-to-java-9\/\"><a href=\"https:\/\/www.sitepoint.com\/ultimate-guide-to-java-9\/\">https:\/\/www.sitepoint.com\/ultimate-guide-to-java-9\/<\/a><\/a>\n<a href=\"http:\/\/www.javamagazine.mozaicreader.com\/JulyAug2017\"><a href=\"http:\/\/www.javamagazine.mozaicreader.com\/JulyAug2017\">http:\/\/www.javamagazine.mozaicreader.com\/JulyAug2017<\/a><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 9 est Features Complete, il est temps de se pencher sur toutes les nouveaut\u00e9s que cette nouvelle version va nous apporter, \u00e0 nous, d\u00e9velopeurs utilisant java. Bien sur, tout le monde a entendu parler de la modularisation du JDK (project Jigsaw) attendu depuis tr\u00e8s longtemps. Et bien, je ne vais pas en parler ici! Je vais m&rsquo;attacher aux nouveaut\u00e9s de Java 9 qui sont \u00e0 destination des d\u00e9velopeurs lambda, pas celles \u00e0 destination des auteurs de framework&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[151,11,158,163],"class_list":["post-652","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-informatique","tag-java","tag-java9","tag-whatsnew"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":739,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/les-optimisations-de-performances-de-java-9\/","url_meta":{"origin":652,"position":0},"title":"Les optimisations de performances de Java 9","author":"admin","date":"vendredi 26 janvier 2018","format":false,"excerpt":"Dans un pr\u00e9c\u00e9dent article sur Java 9, j'avais parcouru les principales nouveaut\u00e9s \u00e0 destination des d\u00e9veloppeurs : http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs. Je vais ici parcourir les principales nouveaut\u00e9s ax\u00e9es sur la performance Je vais encore reprendre les principales JEP : JEP 143: Improve Contended Locking Optimisation des monitors Java (optimisation des locks) en\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":722,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-10-quoi-de-neuf\/","url_meta":{"origin":652,"position":1},"title":"Java 10 : quoi de neuf ?","author":"admin","date":"lundi 26 mars 2018","format":false,"excerpt":"Maintenant que Java 10 est sorti, il est temps de se pencher sur les nouveaut\u00e9s de cette version. Comme pour mon pr\u00e9c\u00e9dent article sur java 9, je vais me pencher principalement sur les changements qui impacterons les d\u00e9veloppeurs utilisant Java en laissant de c\u00f4t\u00e9 les changements internes\/anecdotique\/sur des API peu\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":947,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-13-quoi-de-neuf\/","url_meta":{"origin":652,"position":2},"title":"Java 13 : quoi de neuf ?","author":"admin","date":"mardi 13 ao\u00fbt 2019","format":false,"excerpt":"Maintenant que Java 13 est features complete (Release Candidate au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui voudraient\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":865,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-12-quoi-de-neuf\/","url_meta":{"origin":652,"position":3},"title":"Java 12 : quoi de neuf ?","author":"admin","date":"mercredi 23 janvier 2019","format":false,"excerpt":"Maintenant que Java 12 est features complete (Rampdown Phase 2 au jour d'\u00e9criture de l'article), c'est le moment de faire le tour des fonctionnalit\u00e9s qu'apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait parti d'une suite d'article sur les nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":829,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-11-quoi-de-neuf\/","url_meta":{"origin":652,"position":4},"title":"Java 11  : quoi de neuf ?","author":"admin","date":"lundi  1 octobre 2018","format":false,"excerpt":"Maintenant que Java 11 est sorti, c'est le moment de faire le tour des fonctionnalit\u00e9s qu'apporte cette version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui voudraient les lires en voici les liens : Java 10,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":979,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-14-quoi-de-neuf\/","url_meta":{"origin":652,"position":5},"title":"Java 14 : quoi de neuf ?","author":"admin","date":"jeudi 16 janvier 2020","format":false,"excerpt":"Maintenant que Java 14 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/652","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=652"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/652\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=652"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=652"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=652"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}