Una delle principali novità di Java 9 è JShell, una shell interattiva alla quale si può inviare direttamente comandi in linguaggio Java ed ottenere delle risposte. Si tratta di un ambiente REPL (Read-Eval-Print-Loop), caratteristica che tanti altri linguaggi hanno da sempre: un esempio su tutti Python.
Per utilizzarla, è necessario invocare il comando jshell, disponibile nella cartella bin del JDK (solo se versione 9):
>jshell | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell>
Una volta avviato, si viene accolti da un messaggio come quello mostrato dopodichè si può iniziare a digitare comandi. Provando il più classico degli esempi, si può immettere il testo System.out.println(“Hello world!”):
jshell> System.out.println("Hello world!") Hello world!
e, in pieno stile REPL, eseguire operazioni immediate:
jshell> 25*4 $2 ==> 100 jshell> 71-43 $3 ==> 28 jshell> 5%2 $4 ==> 1
Si noti che non solo sono stati emessi i risultati direttamente ma sono stati anticipati da un identificatore composto da un simbolo $ ed un numero ($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à la somma di 100 e 28 e ne restituirà il risultato, 128:
jshell> $2+$3 $5 ==> 128
Si possono utilizzare anche oggetti e metodi proprio come siamo abituati a fare nel codice Java ordinario:
jshell> String frase="Questa è la nostra prima prova con JShell" frase ==> "Questa è la nostra prima prova con JShell" jshell> frase.length() $7 ==> 41 jshell> frase.toUpperCase() $8 ==> "QUESTA È LA NOSTRA PRIMA PROVA CON JSHELL" jshell> frase.substring(12) $9 ==> "nostra prima prova con JShell"
In questo caso, abbiamo definito una stringa ed invocato su di essa metodi appartenenti alla classe String. Ogni risultato fornito continua ad essere applicato ad una variabile, a meno che non ne esista già una esplicita che lo contiene come per il caso di frase. Volendo possiamo continuare ad utilizzare le variabili implicite ottenute:
jshell> $9.length() $10 ==> 29 jshell> $9.toUpperCase() $11 ==> "NOSTRA PRIMA PROVA CON JSHELL" jshell> $9.endsWith("ell") $12 ==> true
I comandi possono essere composti da più righe come nel seguente caso in cui eseguiamo un ciclo per la stampa di alcuni numeri. JShell riconoscerà quando la direttiva è terminata e deve essere eseguita:
jshell> for(int i=0; i<10; i++) ...> System.out.println("#"+i) #0 #1 #2 #3 #4 #5 #6 #7 #8 #9
Una delle applicazioni principali di JShell è l’impiego di Stream API ed espressioni Lambda (le novità di Java 8) che con la loro sintassi estremamente sintetica permettono di svolgere molte operazioni nello spazio di una riga:
jshell> Stream.of(12, 56, 8, 34, 20).filter(x -> x>=20).sorted().forEach(System.out::println) 20 34 56
Il comando precedente, ad esempio:
- crea uno Stream composto dai valori 12, 56, 8, 34 e 20;
- li filtra mantenendo solo quelli che valgono almeno 20;
- li ordina in senso crescente;
- li stampa uno per uno.
Come si vede, l’espressività di Java a partire dalla versione 8 sposa perfettamente l’immediatezza di un ambiente REPL.
JShell è destinato ad occupare sempre più spazio nella vita degli sviluppatori, anche in ambienti didattici dove l’immediatezza di un ambiente REPL può essere un ottimo modo per avvicinare appassionati e neofiti.
Alla prossima con tante altre novità del linguaggio Java!
No Responses to “Java 9: programmazione interattiva con JShell”