La programmazione funzionale ha due qualità principali che la definiscono: enfasi su dati immutabili e funzioni di prima classe. Entrambi sono - con qualche sforzo e ragionevoli - realizzabili in Java.
Puoi certamente avere oggetti immutabili. Stabilire esplicitamente lo stato dell'oggetto tramite il costruttore, non esporre i setter e applicare la parola chiave final
ai campi. Ogni volta che si dovrebbe modificare un metodo nello stato interno dell'oggetto, è necessario restituire una nuova istanza con lo stato aggiornato. Un approccio come questo è stato presentato in Real-World Functional Programming , un libro contenente esempi di codice funzionale in F # e corrispondenti codice in C #. Mentre C # è più adatto alla programmazione funzionale rispetto a Java, un approccio simile potrebbe ancora essere applicato a Java.
Quando si tratta di funzioni di prima classe, le cose diventano un po 'più complicate. Al momento Java ha un meccanismo piuttosto goffo e prolisso di emulazione di funzioni che utilizzano classi nidificate anonime, con un supporto limitato per le chiusure. Mentre è sufficiente scrivere almeno alcuni pezzi di codice in uno stile funzionale, sarebbe un'esperienza scialba rispetto all'uso di un linguaggio funzionale appropriato. Sono disponibili librerie Java, in particolare guava , che introducono alcuni concetti di programmazione funzionale in Java, come immutabili collezioni e alcuni idiomi funzionali. Questo probabilmente renderebbe l'esperienza meno raccapricciante, ma anche la documentazione ufficiale per guava afferma che gli idiomi funzionali dovrebbe essere usato con parsimonia, in quanto spesso portano a un codice che è più prolisso, meno chiaro e meno efficiente della corrispondente versione imperativa.
La situazione per Java dovrebbe migliorare con il rilascio di SE 8, impostato per includere chiusure appropriate e espressioni lambda, rimandate da SE 7. Nel frattempo puoi provare uno dei vari linguaggi funzionali di JVM e interop con Java quando necessario .