Slide seconda lezione al linguaggio Java 8 in preparazione alla certificazione OCA 1Z0-808.
Argomenti:
Costrutto if then else,operatore ternario
Cicli, attenzione ai blocchi di codice innestati senza le parentesi
Break e continue
Casting, AutoBoxing e AutoUnboxing
Dati possibili con gli switch
Diversi modi di scrivere l'assegnazione e la dichiarazione degli Array
Priorità degli operatori
Esempi di cicli for
Il ciclo for migliorato
Iterator
Lezione del 30-10-2017 tenuta da Valerio Radice presso Nextre Engeneering
https://www.nextre.it/corso/corso-java-oca/
3. Di cosa si parlerà ?
Costrutto if then else,operatore ternario
Cicli, attenzione ai blocchi di codice innestati senza le parentesi
Break e continue
Casting, AutoBoxing e AutoUnboxing
Dati possibili con gli switch
Diversi modi di scrivere l'assegnazione e la dichiarazione degli Array
priorità degli operatori
Esempi di cicli for
Il ciclo for migliorato
Iterator
4. Array
Un array è una collezione indicizzata che ci permette di tenere traccia di un
insieme di dati, sia primitivi che reference, o di altri array.
Per usare un array bisogna:
Dichiararlo //char room [];
Creazione //room = new char[3];
Inizializzazione //room[0] = 'k'; room[1] = 'y'; room[2] = 'z';
Nota: gli indici partono sempre da 0!
5. Array
//Dichiarazione
char room [];
char room1[];
char[] rooms;
char [] rooms1;
//Creazione
room = new char [2];
room1 = new char[2];
//Inizializzazione
room[0] = 'k';
room1 [1] = 'Y';
//Contrazione
char room9 [] = {'k','Y','z'};
char room8[] = {'k','Y','z'};
char [] room7 = {'k','Y','z'};
char[] room6 = {'k','Y','z'};
int qta = room.length; //è una proprietà! Non un metodo!
6. Array multidimensionali
Un array multidimensionale, o
matrice, è un array di array.
Valgono le stesse regole
dichiarative degli array
int matrix [][] = new int[3][];
matrix [0] = new int[5];
matrix [1] = new int[2];
matrix [2] = new int[6];
matrix[0][0] = 8;
matrix[0][1] = 5;
// ...
matrix[1][0] = 52;
matrix[1][1] = 49;
matrix[2][0] = 128;
matrix[2][1] = 256;
// ...
//forma contratta
int matrix2 [][] = {
{8,5,3,4,5},
{52,49},
{128,256,512,1024,2048,4096}
};
7. Args
Nella creazione di un programma il metodo main vuole obbligatoriamente in
ingresso un parametro di tipo String[] chiamato solitamente args, che
contiene l'elenco dei parametri con il quale il comando java è stato lanciato.
Es:
Dato il programma hello.java che prende come argomento nome e cognome
public static void main(String[] args) {…}
java hello Valerio Radice
Conterrà in posizione 0 la stringa Valerio (args[0])
Conterrà in posizione 1 la stringa Radice (args[1])
8. varargs
L'uso dei varargs (java > 5) permette di passare un numero imprecisato e quindi rende
molto più veloce fare un overload dei metodi.
Usare un varargs richiede l'ausilio della keyword … (non importa se vicino al tipo,
all'identificatore o spaziato da entrambi) e va sempre inserito, per ovvi motivi, come
ultimo parametro. Non posso avere più varargs in una dichiarazione. I varargs sono
considerati come array.
public double somma(double base, double ... numeri){
double ris = 0D + base;
for(double n : numeri){
ris+=n;
}
return ris;
}
10. Operatori
Java eredita tutti gli operatori di C
Ogni operatore ha un livello di priorità cosicchè possa definire un ordine di
valutazione anche senza aver bisogno delle parentesi (quando possibile).
Usare solo le parentesi tonde per definire l'ordine delle operazioni da seguire.
Per concatenare due stringhe si può usare il metodo append() o più
semplicemente usare l'operatore di somma (+). In realtà il compilatore
trasformerà tutte le stringhe in col metodo append() della classe StringBuilder.
13. Test
//int a = 128;
//byte b = (byte) a;
boolean flag = ( ( a != 0) && ( b/a > -10 ) );
boolean flag1 = ( a != 0) || ( b/a > 10 );
boolean flag2 = ( a != 0) & ( b/a > 10 );
14. Controllo del flusso
Per gestire l'esecuzione del programma e permettere delle scelte operative Java
mette a disposizione due tipi di costrutti:
Condizioni
if / operatore ternario
switch
Cicli
while
for e forEach
do
15. if
Il costrutto if permette a java di prendere delle decisioni
if (test) { statement se vero } else { statement se falso }
In caso di UNA sola istruzione si possono omettere le parentesi graffe.
if ( pos == 1 )
str = "Hai vinto";
else
str = "Hai perso";
16. else if
Nel caso in cui si voglia creare una struttura che nel caso di falsità controlli
nuovamente un nuovo valore di test è possibile usare il costrutto else if. Es:
if (espressione){
//todo …
} else if (espressione2) {
//todo …
}else {
//todo …
}
17. Annidamento
Anche in caso di valutazione positiva è possibile valutare un'altra condizione.
Usare le parentesi graffe per circondare anche una sola istruzione è buona norma e
aumenta la leggibilità.
int x=3, x2=0,k;
if ( x > 2 )
if ( x2 < 5 )
k=0;
else
k=9;
else
k=3;
System.out.println(k);
int x=3, x2=0,k;
if ( x > 2 )
if ( x2 < 5 )
k=0;
else
k=9;
else
k=3;
System.out.println(k);
int x=3, x2=0,k;
if ( x > 2 ){
if ( x2 < 5 ){
k=0;
} else {
k=9;
} else {
k=3;
}
System.out.println(k);
18. Operatore ternario
Quando si tratta di prendere decisioni in linea o valutare condizioni semplici si
può usare l'operatore ternario, che NON sostituisce l'if!
variabile = (espressione) ? caso vero : caso falso;
Non è possibile fare assegnamenti nei casi di verità, ma l'operatore ternario
ritorna sempre un valore.
String sesso = (str==1) ? "M" : "F"; //ok
(str==1) ? sesso="M" : sesso="F"; //errore di compilazione
19. While
Permette di iterare un blocco di codice n volte fintantoché una condizione risulta
vera (esce col falso). Il codice potrebbe non essere mai eseguito, prima si valuta
poi si esegue!
while (espressione booleana){
//todo…
[aggiornamento
variabile di
controllo ]
}
int volte = 0;
while (volte < 5){
System.out.println(volte);
volte = volte + 1;
}
//refactor
volte = 0;
while (volte < 5){
System.out.println(volte++);
}
20. for
Il ciclo "for" permette di iterare un blocco di codice per un numero di volte definito,
prevede una dichiarazione, una condizione e un aggiornamento (o blocco di istruzioni –
statement)
for( inizializzazione; condizione; aggiornamento )
istruzione o { blocco };
È consigliabile usare sempre uno statement anche con una sola istruzione, si migliora
la leggibilità del codice.
Il blocco di inizializzazione permette anche di creare delle variabili, divise da virgola e
dello stesso tipo, che smetteranno di esistere al di fuori di esso. Il blocco della
condizione permette di dichiarare condizioni complesse e composte. Il blocco di
aggiornamento permette di agire anche su più variabili (anche diverse da quelle
istanziate), dividendo le istruzioni con la virgola.
21. for
Tutti i blocchi di inizializzazione del ciclo for sono opzionali.
È possibile scrivere anche: for(;;){} //questo crea un ciclo infinito, tutto sarà
gestito dallo sviluppatore dentro allo statement.
for (int i = 0; i<5; i++)
System.out.println("i: "+i);
for (int vr1 = 0, vr2 = 9; k<=15 ;k++, vr2--, --vr1){
System.out.println("vr1: " + vr1 +
"tvr2: " + vr2 +
"tk: " + k);
}
22. do
Il costrutto "do" è molto simile come funzionamento al costrutto "while" solo che
l'esecuzione viene garantita almeno una volta perché la condizione viene
verificata solo a seguito del blocco di codice da ripetersi; se la condizione è falsa
il ciclo si interrompe.
[inizializzazione;]
do{
statement
[aggiornamento]
} while (condizione)
k= 0;
do {
System.out.println("k vale: " + k);
k++;
}while(k<5);
23. for migliorato (semplificato)
Il ciclo for migliorato è meno potente del ciclo for, viene anche detto foreach
in quanto ogni elemento, avanzando sempre nell'array, viene estratto e reso
disponibile allo sviluppatore.
Questo ciclo for non ha indici (non è posizionale, manca anche di
aggiornamento), può essere scorso solo in una direzione (avanzamento). Sintassi:
for (TipoElemento item : items){
//item è disponibile
}
for (char xc : "Demo".toCharArray()){
System.out.println(xc);
}
24. switch
Il costrutto switch permette di fare
delle scelte sulla base di un valore di
test preso in esame. Non tutti i tipi
possono essere testati, in dettaglio si
possono usare String, byte, short, int,
char e relative classi wrapper, ed
enumerazioni;
Ogni caso fa inserito in un blocco case
e terminato con break, altrimenti
verranno eseguiti anche gli altri
blocchi case. Se nessun blocco case è
verificato può essere eseguito in case
"default", ultimo della lista.
Il blocco default è consentito anche in
posizione precedente, in tal caso
influenzerà le altre scelte (precedenti
o successive).
switch (k){
case 1:
System.out.println("Aperto");
break;
case 2:
System.out.println("Chiuso");
break;
case 3:
System.out.println("Self-service");
break;
default:
System.out.println("Scelta errata");
}
25. break & continue
Sono due parole riservate che permettono di rompere lo statement (e rompere
una decisione). In caso di una continuazione prematura si può usare il continue
per riportare il ciclo al prossimo step.
In caso di più cicli annidati come fare a capire quello da rompere? Grazie alla
label è possibile etichettare uno statement (e agire su di esso come
conseguenza).
nomeDellaLabel: do{ //todo… }while (condizione);
Basterà poi richiamare break nomeDellaLabel;
26. Iterator
È un oggetto che permette di ciclare una Collection in una sola direzione ed estrarre
ogni singolo valore.
Permette di trattare allo stesso modo i diversi oggetti della classe Collection.
Implementazione del Design Pattern Iterator come semplificazione nell'uso degli
oggetti della classe Collection.
Metodi comuni:
hasNext() -> boolean : ritorna true se ho ancora elementi
next() -> <E> : restituisce l'elemento successivo
remove() -> void : rimuove un oggetto dalla collezione
Per le liste anche all'indietro:
previous() -> <E> : ritorna l'elemento precedente
hasPrevious() -> boolean : ritorna true se ho ancora elementi precedenti
add(<E>) -> void : permette di aggiungere un elemento alla lista
nextIndex() / previousIndex() -> int : ritorna l'indice del prossimo/precedente
elemento.
27. Iterator
ArrayList al = new
ArrayList();
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
System.out.print("Original contents of al: ");
Iterator itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
28. Domande
Elenca i tipi primitivi.
Quali sono gli argomenti obbligatori per un ciclo for?
Cosa non si può fare con il ciclo for migliorato
Come si dichiarano e usano gli array?
Quali tipi possono essere testati con un costrutto switch?
Il costrutto for può sostituire il while?
Che differenza c'è tra ++k e k++?
Dato x = 0 quanto vale x dopo ris = ++x * x--?