2011-12-22 8 views
13

Mi piacerebbe usare Java funzionale o Guava (o meno Scala) in un corso che insegnerò. Sebbene ci siano molti linguaggi funzionali che girano sulla JVM, mi piacerebbe attenermi a qualcosa che somiglia più a Java possibile, cioè qualcosa che sia più compatibile, concettualmente e sintatticamente, con le funzionalità funzionali previste in Java 8Esiste un buon confronto tra Java funzionale e Guava?

Sembra che Functional Java e Guava siano i migliori candidati. Non sono stato in grado di trovare nulla che li comparasse in termini di funzionalità, facilità d'uso, vicinanza concettuale a Java diretto, ecc. Qualcuno sa di un buon confronto tra queste librerie?

+1

Qual è la domanda qui? Potresti voler modificare la tua Q per rendere più chiaro ciò che stai chiedendo ... \ [modifica \] La Q è nel titolo, sì, ma potresti voler riformularla nella Q stessa. – BenCole

+2

Guava è solo una libreria Java con molti utili metodi di utilità. Sì, ha alcune cose che ti permetteranno di programmare in modo funzionale, ma non è particolarmente focalizzato sulla programmazione funzionale. – Jesper

+0

Grazie per le risposte qui sotto. Avevo capito male gli obiettivi di Guava. Ho anche dedicato un po 'più di tempo a guardare Java funzionale. Anch'esso è (ancora) appesantito dalla sintassi Java attuale. Questo mi porta ora a piegarmi verso Scala. Mi rendo conto che Scala sta diventando sempre più mainstream. Anche così penso che sarebbe molto utile per la maggior parte degli studenti imparare a fare programmazione funzionale in Java diretto. (Quando insegniamo la programmazione funzionale come un "paradigma" usiamo Haskell. Dubito che gli studenti imparino abbastanza, anche se per farlo entrare nel loro sangue.) Questo porta alla domanda: quando è previsto Java 8? – RussAbbott

risposta

17

L'obiettivo di Guava non è fornire idiomi funzionali in Java. Dalla pagina wiki Functional Explained Guava:

L'uso eccessivo di idiomi di programmazione funzionale di Guava può portare a codice verbose, confuso, illeggibile, e inefficiente. Questi sono di gran lunga le parti di Guava più facilmente (e più comunemente) abusate, e quando vai a lunghezze assurde per rendere il tuo codice "un one-liner", il team di Guava piange.

Accertarsi, quando si utilizzano le utilità funzionali di Guava, che il modo imperativo tradizionale di fare le cose non sia più leggibile . Prova a scrivere . Era così brutto? È stato più leggibile rispetto all'approccio funzionale stravagante che stavi per provare?

Appoggiandosi troppo pesantemente su linguaggi funzionali rende non troppo senso fino a Java 7, come il sovraccarico è troppo alto (vedi vertical problem). Questo cambierà con Java 8, che cambierà il modo in cui le librerie e i programmi Java sono progettati a livello di dettaglio. Le cose che hanno un senso in Java fino a 7 saranno scoraggiate in una certa misura in Java 8. Ciò motiverà una nuova edizione di Java efficace e molte nuove API.

Se si sta tentando di insegnare la programmazione funzionale è probabilmente meglio attenersi a un linguaggio funzionale (più o meno) puro. Ogni lingua che è un melange (o emulazione) di FP e OOP sarà una distrazione.

+3

Devo anche sottolineare la frase precedente in questo articolo: "A partire da Java 7, la programmazione funzionale in Java può essere approssimata solo attraverso l'uso scomodo e prolisso di classi anonime. Ci si aspetta che cambi in Java 8, ma Guava è attualmente rivolto agli utenti di Java 5 e superiori. " –

6

Come detto sopra, Guava è solo una libreria Java - una libreria compatibile con Java 5, anche (dalla versione 11). La posizione di Guava sulla programmazione funzionale è riassunta da Kevin Bourrillion:

"La sintassi fa schifo. Allo stesso tempo, questa roba è ora, è sempre stata e sarà sempre nient'altro che una misura di stopgap fino a quando non potrà venire il giusto cambio di lingua, momento in cui finalmente potremo finalmente decidere la sintassi ottimale e avviare la programmazione in stile funzionale effettivamente rendere le vite migliori in Java per una volta. Quindi sono indeciso su quanti sforzi mettere nella roba della Funzione/Predicato; è nella libreria più perché è un po 'come dovrebbe essere, non tanto perché pensiamo che sia un gioiello della corona. "

4

Dal momento che Guava è più di una libreria generica che sembra avere idiomi funzionali, e Java funzionale è puramente sull'implementazione di idiomi funzionali in Java, Functional Java suona come una soluzione migliore con probabilmente un set più completo di funzionalità simili a FP.

Il rovescio della medaglia, preferisco Guava perché è più generico, e quindi mi trovo a utilizzare molte delle caratteristiche che non sono correlate agli idiomi funzionali.

Uno dei problemi con entrambe le librerie (come indicato nel Wiki di Guava nei post precedenti) è il "rumore verticale" delle classi interne anonime per gli oggetti funzionali. Un'altra libreria che tenta di risolvere questo problema tramite annotazioni e l'APT è Jedi.

Un altro approccio che rende meno rumorose le annotazioni precedenti (Guava, FJ o Jedi) senza annotazioni è una libreria che ho scritto, Funcito, ispirata alla sintassi di Mockito. È più limitato in ciò che può semplificare a questo punto, essenzialmente avvolgendo le chiamate al metodo singolo, ma è quello che attualmente mi trovo a fare già per la maggior parte del tempo.

+0

Quando intendi il rumore verticale. Stai parlando della codifica verbosa in quanto si riferisce all'aggiunta delle classi interne anonime o al sovraccarico nelle tue librerie jar nella creazione di un gruppo di quei file di classe bytecode? –

+0

Il primo: classi interne anonime. –