Oltre al poter utilizzare le istruzioni lambda nel Comparator, nulla di quanto visto è particolare di Java 8, vediamo come questa versione di Java fornisce strumenti per poter scrivere codice più conciso ed efficiente e nuovi metodi quali merge, computIfPresent, computIfAbsent, forEach e removeIf

Usare il method references

Il method references è una modalità più compatta di scrittura del codice omettendo alcuni parti che possono essere dedotte automaticamente dal compilatore.

Per capire questo concetto è bene iniziare con un esempio pratico :

public class AereoHelper {
  public static int compareByPeso(Aereo a1, Aereo a2) {
    return a1.peso - a2.peso;
  }
  publis static int compareByNome(Aereo a1, Aereo a2) {
    return a1.nome.compareTo(a2.nome);
  }
}

Continua a leggere

Abbiamo visto come alcune Collections memorizzano gli elementi secondo un ordine, sappiamo che ad esempio sulle String l’ordinamento viene fatto sui caratteri che la compongono, o sui numeri che seguono un ordinamento naturale.

Possiamo però ordinare anche gli oggetti che definiamo noi, Java ti fornisce un interfaccia chiamata Comparable, se la tua classe implementa questa interfaccia, può essere memorizzata in strutture dati che prevedono l’ordinamento, altrimenti prenderai un eccezione quando tenterai di aggiungerle.

Java ti fornisce anche una classe per eseguire ordinamenti senza che le tue classi implementino Comparable, questa classe di chiama Comparator.

Continua a leggere

In java, una collection è un insieme di oggetti contenuti all’interno di un singolo oggetto, il Java Collection Framework è un set di classi contenute nel package java.util che definisce 4 interfacce :

  • List – lista ordinata di oggetti che permette la presenza di duplicati, gli elementi sono accessibili per mezzo di un indice
  • Set – lista che non permette la presenza di duplicati
  • Queue – è una collection che ordina gli elementi in base al loro utilizzo, in genere si usa in FIFO, First In First Out, ma è possibile processarla in maniera differente
  • Map – è una collection che associa una chiave ad un elemento

Solo una precisazione, tutte queste interfacce estendono Collection tranne Map, Map fa parte del Java Collection Framework ma non implementa Collection

Continua a leggere

I generics, introdotti dalla versione 5 di Java, aiutano a scrivere codice più sicuro, evitando rischi di invocazione errata o utilizzo improprio di collection. Vediamo un esempio di codice pericoloso che utilizza le collection senza l’uso dei generics:

static void stampa(List lista) {
  for (int i = 0 ; i < lista.size() ; i++) {
    String nome = (String)lista.get(i);
    System.out.println(nome);
  }
}
public static void main(String... a) {
  List nomi = new ArrayList<>();
  nomi.add(new StringBuilder("carlo"));
  stampa(nomi);
}

Questo codice compila perfettamente, ma in esecuzione otterremmo un bel ClassCastException !

Continua a leggere

Il Java Collection framework include le classi che implementano le seguenti interaccie : Map, List, Queue e Set.

Durante la certificazione OCA abbiamo studiato solo la classe ArrayList, per l’OCP è richiesta la conoscenza molto più approfondita delle classi fondamentali di ogni interfaccia, in particolare, vedremmo tutte le caratteristiche, come ordinarle e come cercare elementi al loro interno.

ArrayList

Questo è un oggetto che  può contenere altri oggetti, di conseguenza, non si possono memorizzare all’interno di un ArrayList, tipi primitivi, a differenza dei comuni array che possono farlo, teniamo sempre in mente però la capacità di Autoboxing di java.

Continua a leggere

I design pattern sono approcci condivisi e ben definiti per la risoluzione di problemi nella programmazione, forniscono strumenti comuni agli sviluppatori per risolvere i problemi più comuni che si incontrano durante lo sviluppo di applicazioni.

Per la certificazione Java non è richiesta la conoscenza dei maggiori pattern, quali ad esempio Adapter, Strategy, Decorator, Visitor etc etc, l’esame di certificazione richiede solo la conoscenza ed il saper implementare 3 di questi, che sono : Sigleton, Builder e Factory che sono un sottoinsieme dei pattern detti creazionali.

Tutti sappiamo come creare oggetti in Java, tramite l’istruzione new :

Aereo md80 = new Md80();

Ma cosi, dobbiamo sapere esattamente che tipo di Aereo vogliamo creare, immaginiamo un torre di controllo, questa può creare diversi tipi di aereo a seconda dell’ordine di decollo, in questo caso dovremmo delegare la costruzione di oggetti in una logica ben precisa, oppure, in ogni aereoporto, vi è sempre e solo 1 torre di controllo operativa a gestire la coda di decollo, come possiamo garantire nella nostra applicazione, che sempre e solo 1 torre sia operativa ?

Continua a leggere

Si tratta di best practice per facilitare lo sviluppo del software, che se applicate correttamente ci permetteranno di ottenere i seguenti vantaggi :

  • Codice più leggibile
  • Il codice è più semplice da comprendere
  • Il codice è maggiormente riutilizzabile
  • Il codice è più manutenibile ed è più semplice la modifica per recepire cambiamenti di requisti

Vediamo questi principi in dettaglio, partendo dal primo :

Continua a leggere

Il polimorfismo è la capacità di un interfaccia di assumere diverse forme, in java ci permette di poter passare diversi tipi di oggetti ad un metodo o classe, dimostriamolo con un semplice esempio :

public interface Aereo { public void vola(); }

public class Md80 implements Aereo {
  public void vola() { System.out.println("md80 sta volando"); }
}
public class Boeing747 implements Aereo {
  public void vola() { System.out.println("Boeing 747 sta volando"); }
}

public class TorreDiControllo {
  public void autorizzaDecollo(Aereo aereo) {
    aereo.vola();
  }
  public static void main(String... args) {
    TorreDiControllo c = new TorreDiControllo();
    c.autorizzaDecollo(new Md80());
    c.autorizzaDecollo(new Boeing747());
  }
}

Continua a leggere

Ora che abbiamo visto e ripassato un pò le interfacce in java, è ora di iniziare a parlare di programmazione funzionale, introdotta con Java 8 per mezzo delle lambda expression.

Alla base della programmazione funzionale di java ci sono le interfacce funzionali.

Cos’è un interfaccia funzionale ? è semplice, si tratta di un interfaccia che definisce un solo metodo astratto.

definizione di un interfaccia funzionale

Vediamo come è possibile definire in java un interfaccia che sia di fatto un interfaccia funzionale :

Continua a leggere

Nella precedente certificazione abbiamo studiato come dichiarare un interfaccia, come estenderla e come implementarla.

Possiamo ricapitolare dicendo che un interfaccia è un tipo astratto di dati simile ad una classe che definisce solo metodi astratti e public che ogni classe che implementa deve definire.

Un interfaccia può anche definire costanti (public static) e da Java 8 anche metodi statici e metodi con implementazione di default.

Vediamo un breve e semplice esempio di un interfaccia e della sua implementazione :

Continua a leggere