{"id":13467,"date":"2018-06-06T09:44:03","date_gmt":"2018-06-06T07:44:03","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=13467"},"modified":"2018-06-06T09:44:03","modified_gmt":"2018-06-06T07:44:03","slug":"java-9-programmazione-interattiva-con-jshell","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/java-9-programmazione-interattiva-con-jshell\/","title":{"rendered":"Java 9: programmazione interattiva con JShell"},"content":{"rendered":"<p>Una delle principali <a href=\"http:\/\/www.devapp.it\/wordpress\/java9-le-novita\/\" target=\"_blank\" rel=\"noopener\">novit\u00e0 di Java 9<\/a> \u00e8 JShell, una shell interattiva alla quale si pu\u00f2 inviare direttamente comandi in linguaggio Java ed ottenere delle risposte. Si tratta di un ambiente <strong>REPL<\/strong> (<strong>R<\/strong>ead-<strong>E<\/strong>val-<strong>P<\/strong>rint-<strong>L<\/strong>oop), caratteristica che tanti altri linguaggi hanno da sempre: un esempio su tutti Python.<\/p>\n<p>Per utilizzarla, \u00e8 necessario invocare il comando <em>jshell<\/em>, disponibile nella cartella <em>bin<\/em> del JDK (solo se versione 9):<\/p>\n<pre class=\"lang:sh decode:true  \">&gt;jshell\r\n|  Welcome to JShell -- Version 9\r\n|  For an introduction type: \/help intro\r\n\r\njshell&gt;<\/pre>\n<p>Una volta avviato, si viene accolti da un messaggio come quello mostrato dopodich\u00e8 si pu\u00f2 iniziare a digitare comandi. Provando il pi\u00f9 classico degli esempi, si pu\u00f2 immettere il testo <em>System.out.println(&#8220;Hello world!&#8221;)<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; System.out.println(\"Hello world!\")\r\nHello world!<\/pre>\n<p>e, in pieno stile REPL, eseguire operazioni immediate:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; 25*4\r\n$2 ==&gt; 100\r\n\r\njshell&gt; 71-43\r\n$3 ==&gt; 28\r\n\r\njshell&gt; 5%2\r\n$4 ==&gt; 1<\/pre>\n<p>Si noti che non solo sono stati emessi i risultati direttamente ma sono stati anticipati da un <strong>identificatore<\/strong> composto da un simbolo <strong>$ ed un numero<\/strong> ($2, $3, $4). Quelle sono variabili implicite create allo scopo di contenere valori frutto di elaborazione e possono essere invocate per riutilizzarli. Ad esempio, $2+$3 eseguir\u00e0 la somma di 100 e 28 e ne restituir\u00e0 il risultato, 128:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; $2+$3\r\n$5 ==&gt; 128<\/pre>\n<p>Si possono <strong>utilizzare anche oggetti e metodi<\/strong> proprio come siamo abituati a fare nel codice Java ordinario:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; String frase=\"Questa \u00e8 la nostra prima prova con JShell\"\r\nfrase ==&gt; \"Questa \u00e8 la nostra prima prova con JShell\"\r\n\r\njshell&gt; frase.length()\r\n$7 ==&gt; 41\r\n\r\njshell&gt; frase.toUpperCase()\r\n$8 ==&gt; \"QUESTA \u00c8 LA NOSTRA PRIMA PROVA CON JSHELL\"\r\n\r\njshell&gt; frase.substring(12)\r\n$9 ==&gt; \"nostra prima prova con JShell\"<\/pre>\n<p>In questo caso, abbiamo definito una stringa ed invocato su di essa metodi appartenenti alla classe <em>String<\/em>. Ogni risultato fornito continua ad essere applicato ad una variabile, a meno che non ne esista gi\u00e0 una esplicita che lo contiene come per il caso di <em>frase<\/em>. Volendo possiamo continuare ad utilizzare le variabili implicite ottenute:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; $9.length()\r\n$10 ==&gt; 29\r\n\r\njshell&gt; $9.toUpperCase()\r\n$11 ==&gt; \"NOSTRA PRIMA PROVA CON JSHELL\"\r\n\r\njshell&gt; $9.endsWith(\"ell\")\r\n$12 ==&gt; true<\/pre>\n<p>I comandi possono essere composti da pi\u00f9 righe come nel seguente caso in cui eseguiamo un ciclo per la stampa di alcuni numeri. JShell riconoscer\u00e0 quando la direttiva \u00e8 terminata e deve essere eseguita:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; for(int i=0; i&lt;10; i++)\r\n   ...&gt; System.out.println(\"#\"+i)\r\n#0\r\n#1\r\n#2\r\n#3\r\n#4\r\n#5\r\n#6\r\n#7\r\n#8\r\n#9<\/pre>\n<p>Una delle applicazioni principali di JShell \u00e8 l&#8217;impiego di Stream API ed espressioni Lambda (le novit\u00e0 di Java 8) che con la loro sintassi estremamente sintetica permettono di svolgere molte operazioni nello spazio di una riga:<\/p>\n<pre class=\"lang:sh decode:true \">jshell&gt; Stream.of(12, 56, 8, 34, 20).filter(x -&gt; x&gt;=20).sorted().forEach(System.out::println)\r\n20\r\n34\r\n56<\/pre>\n<p>Il comando precedente, ad esempio:<\/p>\n<ul>\n<li>crea uno Stream composto dai valori 12, 56, 8, 34 e 20;<\/li>\n<li>li filtra mantenendo solo quelli che valgono almeno 20;<\/li>\n<li>li ordina in senso crescente;<\/li>\n<li>li stampa uno per uno.<\/li>\n<\/ul>\n<p>Come si vede, l&#8217;espressivit\u00e0 di Java a partire dalla versione 8 sposa perfettamente l&#8217;immediatezza di un ambiente REPL.<\/p>\n<p>JShell \u00e8 destinato ad occupare sempre pi\u00f9 spazio nella vita degli sviluppatori, anche in ambienti didattici dove l&#8217;immediatezza di un ambiente REPL pu\u00f2 essere un ottimo modo per avvicinare appassionati e neofiti.<\/p>\n<p>Alla prossima con tante altre novit\u00e0 del linguaggio Java!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una delle principali novit\u00e0 di Java 9 \u00e8 JShell, una shell interattiva alla quale si pu\u00f2 inviare&#8230;<\/p>\n","protected":false},"author":561,"featured_media":13595,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1526,2073,2074,2075],"class_list":["post-13467","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-java","tag-java-9","tag-jshell","tag-repl"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=13467"}],"version-history":[{"count":4,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13467\/revisions"}],"predecessor-version":[{"id":13594,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13467\/revisions\/13594"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/13595"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=13467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=13467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=13467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}