web-dev-qa-db-fra.com

La programmation fonctionnelle est-elle possible en Java?

Je parcourais la librairie Amazon.com et je suis tombé sur le livre "Functional Programming for Java Developers" .

Je connais une programmation fonctionnelle très basique et je programme en Java depuis 3 ans.

Je voudrais savoir si la programmation fonctionnelle est même possible en Java?

42
Vinoth Kumar C M

Cela dépend de ce que vous entendez par "programmation fonctionnelle" et par "possible".

Vous pouvez évidemment implémenter des choses en suivant un paradigme fonctionnel. Cependant, le langage Java ne fournit pas le sucre syntaxique pour cela, donc certaines choses seront au mieux fastidieuses, et d'autres seront extrêmement mystérieuses.

De même, vous pouvez très bien écrire du code orienté objet dans un langage reconnu comme non OO, comme C.

Bibliothèques Java

Il existe des bibliothèques qui peuvent vous aider à le faire, en faisant déjà le travail préparatoire pour vous et en cachant les choses arcaniques:

Celles-ci vous permettront d'écrire Java code avec une approche plus fonctionnelle et peut-être une syntaxe et une sémantique plus familières, comme vous pouvez vous y attendre d'un langage compétent en FP.

Langues JVM

Et évidemment, vous pouvez implémenter un langage fonctionnel au-dessus de Java. Pour que vous puissiez ensuite l'utiliser comme langue FP. Ce qui est un peu un niveau d'abstraction plus élevé que ce que vous avez demandé, mais relativement dans le contexte (bien que je triche un peu ici, accordé).

Par exemple, consultez:

Langages JVM fonctionnels plus ou moins

Bien qu'ils ne soient peut-être pas exactement ce que vous voulez, il existe un certain nombre d'autres langages qui ont été portés sur la plate-forme Java et qui pourraient vous libérer de Java relativement peu orienté vers le plaisir (oui, jeu de mots) et vous donne déjà plus de flexibilité. Des concurrents notables comme JRuby , Jython et Rhino (respectivement pour Ruby =, Python et JavaScript / ECMAScript ) offrent également un potentiel intéressant pour la programmation fonctionnelle, bien qu'ils ne soient sans doute pas vraiment des langages de programmation fonctionnels par nature. JetBrains ' Kotlin , tout en reconnaissant clairement qu'il ne s'agit pas d'un langage fonctionnel, prend en charge certaines constructions fonctionnelles et vaut également le coup d'œil.

Lectures complémentaires

Vous pouvez également vouloir lire ou regarder ces articles ou vidéos:

70
haylem

Je lis le livre que tu as mentionné. C'est vraiment un bon BTW.

Oui, il est possible d'être fonctionnel en Java. Je ne sais pas dans quelle mesure vous pouvez y parvenir mais vous pouvez implémenter de nombreux idiomes de programmation fonctionnelle.

L'une des choses les plus importantes est d'essayer de coder avec la mentalité "Ne pas muter les états".

Par exemple, vous utilisez le mot clé final pour atteindre l'immuabilité. Si vous prévoyez d'utiliser une structure de données, vous devez coder dans des structures de données immuables. La bibliothèque Google Guava le fait déjà.

Aussi pour la programmation simultanée, vous pouvez compter sur le framework Akka (le modèle d'acteur).

Il convient de mentionner que le bytecode JVM ne prend pas en charge (au moins encore) l'optimisation des appels de queue, une fonctionnalité très importante pour les langages de programmation fonctionnels.

11
Chiron

Oui, c'est définitivement possible, de la même manière que c'est possible dans n'importe quelle combinaison langage/environnement d'exécution turing-complete. Vous pouvez même le faire fonctionner assez bien si vous savez ce que vous faites.

Je ne sais pas à quel point c'est sensé. En particulier, sachez que ce n'est pas particulièrement idiomatique (c'est-à-dire que cela aura l'air très étrange, vous devrez faire des choses non conventionnelles et confondre les personnes habituées à Java).

Vous vous retrouverez avec un code étrange, par exemple pour définir une nouvelle fonction:

Function twoStrings=new Function() {
  public Object apply(Object param1) {
    // do something to param1 and return a result
  }
}

Pour faire une programmation fonctionnelle, vous avez généralement besoin:

  • Fonctions de première classe - facile à créer en Java en définissant une classe abstraite ou une interface qui représente votre "Fonction" et a une méthode "apply" qui applique la fonction à un ou plusieurs paramètres.
  • Fermetures - créez une instance de votre objet fonction ci-dessus avec les valeurs fermées stockées dans les champs finaux. Vous pouvez utiliser une classe interne anonyme pour cela.
  • Une bibliothèque de fonctions standard d'ordre supérieur - c'est plus délicat, mais vous pouvez toujours écrire les vôtres dans bootstrap simple langage fonctionnel en quelques heures. Si vous voulez quelque chose de plus sophistiqué, vous pouvez consulter d'autres bibliothèques fonctionnelles que les gens ont construites en Java.

C'est donc possible comme exercice et même comme projet de loisir intéressant. Mais vous voulez vraiment faire une programmation fonctionnelle sérieuse tout en conservant les avantages de la JVM/accéder aux bibliothèques Java puis Clojure est de loin votre meilleure option à mon avis.

p.s. puisque le cœur de Clojure est en fait écrit en Java, c'est en fait un exemple de cas très intéressant de la façon de faire de la programmation fonctionnelle en Java tout en cachant les détails en désordre derrière une nouvelle syntaxe de langage moderne agréable. - Le code source de Clojure est sur GitHub pour les personnes intéressées.

6
mikera

Il est possible d'être quelque peu fonctionnel en Java. Le faire est très douloureux. Au lieu de

myList.each { doSomething(it); }

Vous avez quelque chose comme:

myList.each(new Function() { public void do(Object arg) { something(); }})

Et si vous voulez une vraie programmation fonctionnelle, avec des fermetures et des fonctions comme objets de première classe, choisissez un autre langage. Scala, Clojure, Groovy s'exécutent tous sur la JVM et peuvent interagir avec les anciennes classes Java classes..

4
kevin cline

La réponse est un "oui, bien sûr" retentissant, mais à mon avis l'une des caractéristiques les plus importantes dans de nombreux langages fonctionnels est l'excellent système de type. Vous ne pourrez jamais gérer cela dans Java vous-même.

Si vous voulez écrire des programmes fonctionnels tout en restant avec la JVM, je peux recommander parmi les suspects habituels Scala et Clojure de regarder Frege . Frege a une syntaxe et un type système très proche de Haskell, mais les programmes sont traduits directement en Java et peuvent interagir avec d’autres codes Java.

3
Ingo

Eh bien, toutes sortes de choses sont possibles. Il est possible de faire de la programmation orientée objet en C; ce n'est tout simplement pas une très bonne idée.

Java n'a pas été conçu pour FP, donc si vous essayez de tout faire dans un style purement FP, vous aurez des problèmes. Vous combattrez la langue, au lieu de travailler avec elle. Et pas seulement le langage - il y a aussi toutes les merveilleuses bibliothèques gratuites Java. Alors n'allez pas pour le FP pur; prenez quelques-unes des idées derrière FP et intégrez-les dans votre Java, mais comprenez que vous ne pouvez pas faire cela pour tous les idées.

2
Mike Baranczak

L'équipe OpenJDK vous encourage à télécharger leurs derniers binaires OpenJDK 8 et à jouer avec les nouvelles expressions lambda et les nouveaux idiomes fonctionnels introduits dans l'API Collections (entre autres). Vous pouvez programmer dans un style fonctionnel clair. Voir "Programmation fonctionnelle en Java?" pour une comparaison des collections JDK8 avec les bibliothèques pré Java8 comme Guava, FunctionalJava et LambdaJ.

0
JohanN