Functional Java est une bibliothèque open source facilitant la programmation fonctionnelle en Java. La bibliothèque implémente de nombreuses abstractions de programmation de base et avancées qui facilitent le développement orienté composition. Functional Java sert également de plate-forme pour apprendre les concepts de programmation fonctionnelle en introduisant ces concepts à l'aide d'un langage familier.
La bibliothèque est destinée à être utilisée dans des applications de production et est minutieusement testée à l'aide de la technique de test automatisé basé sur les spécifications avec ScalaCheck et le module quickcheck de Functional Java.
Functional Java fournit des abstractions pour les types suivants :
Structures de données de base - fonctions totales et partielles, produits, unité, option, unions impartiales et biaisées à droite (soit et validation), nulles.
Collections immuables - tableau, liste, vecteur, flux, ensemble, carte, file d'attente prioritaire, arbre à doigts, liste hétérogène, liste de différences.
Autres abstractions - monoïde, semi-groupe, naturel, générateur de nombres aléatoires, lecteur, écrivain, état, entrée/sortie, analyseur, fermeture éclair, tests basés sur des spécifications (quickcheck), acteurs, optique (lentille, prisme, pli, traversée et autres), concurrence et conversion de type.
Les URL importantes pour le projet sont :
Site Web, http://www.functionjava.org
Dépôt de site Web, http://github.com/functionjava/functionjava.github.io
Version d'intégration continue de Travis, https://app.travis-ci.com/github/fonctionneljava/fonctionneljava
Dépôt Sonatype, https://oss.sonatype.org/content/groups/public/org/functionaljava/
Dépôt Maven Central, https://mvnrepository.com/artifact/org.functionjava/functionjava
La méthode recommandée pour télécharger et utiliser le projet consiste à utiliser votre outil de construction.
L'artefact Functional Java est publié sur Maven Central à l'aide du groupe org.functionaljava
avec trois artefacts publiés :
la bibliothèque principale ( functionaljava
)
tests basés sur les propriétés ( functionaljava-quickcheck
)
une petite quantité de support de Java 8 ( functionaljava-java-core
)
La dernière version stable est 5.0
. Cela peut être ajouté à votre projet Gradle en ajoutant les dépendances :
compiler "org.fonctionneljava:fonctionneljava:5.0" compiler "org.fonctionneljava:fonctionneljava-quickcheck:5.0" compiler "org.fonctionneljava:fonctionneljava-java-core:5.0"
et en Maven :
<dépendance> <groupId>org.fonctionneljava</groupId> <artifactId>Java fonctionnel</artifactId> <version>5.0</version> </dépendance> <dépendance> <groupId>org.fonctionneljava</groupId> <artifactId>fonctionneljava-quickcheck</artifactId> <version>5.0</version> </dépendance> <dépendance> <groupId>org.fonctionneljava</groupId> <artifactId>fonctionneljava-java-core</artifactId> <version>5.0</version> </dépendance>
La construction est réalisée à l'aide de Java 8 et Gradle 7.4. Dans le répertoire racine, exécutez :
./gradlew
Cela nécessite un accès à Java 8 et téléchargera l'outil de construction Gradle et les dépendances nécessaires et générera FunctionalJava.
Une description plus complète des fonctionnalités mentionnées ci-dessus sont :
Structures de données de base
Fonctionne avec une arité 1 à 8 ( fj.F
).
Fonctions d'arité 0 à 8 pouvant produire des exceptions ( fj.Try
).
Fonctions avec une arité de 0 à 8 qui ont un retour vide ( fj.Effect
).
Fonctions avec une arité de 0 à 8 qui ont un retour vide et peuvent lever une exception ( fj.TryEffect
).
Produits d'arité 1 à 8 ( fj.P
).
Type d'unité ( fj.Unit
).
Valeur facultative - null de type sécurisé ( fj.data.Option
).
Type de données d'union disjointe - gestion des exceptions de composition ( fj.data.Either
).
Validation - gestion des exceptions compositionnelles biaisées à droite ( fj.data.Validation
).
Collections immuables
Wrapper de tableau ( fj.data.Array
).
Liste immuable, en mémoire, à chaînage unique ( fj.data.List
).
Liste paresseuse immuable à chaînage unique ( fj.data.Stream
).
Un package ( fj.data.fingertrees
) fournissant 2-3 arbres de doigts pour une représentation fonctionnelle de séquences persistantes, prenant en charge l'accès aux extrémités en temps O(1) amorti.
Liste hétérogène de type sécurisé ( fj.data.hlist
) pour les listes d'éléments de types différents sans sacrifier la sécurité des types.
Implémentation d'un ensemble immuable à l'aide d'un arbre rouge/noir ( fj.data.Set
).
Arbre multidirectionnel immuable - alias rosier ( fj.data.Tree
).
Tree-map immuable utilisant une implémentation d'arbre rouge/noir ( fj.data.TreeMap
).
File d'attente prioritaire immuable utilisant des arbres à doigts ( fj.data.PriorityQueue
).
Les listes de différences, une liste très performante.
Autres abstractions
Monoïde ( fj.Monoid
).
Semigroupe ( fj.Semigroup
).
Type de données nombre naturel ( fj.data.Natural
).
Générateur de nombres aléatoires utilisant un générateur congruentiel linéaire ( fj.LcgRng
).
Monades Reader, Writer et State ( fj.data.Reader
, fj.data.Writer
, fj.data.State
).
Monade d'entrée/sortie pour abstraire les IO ( fj.IO
).
Combinateurs d'analyseurs monadiques pour écrire des analyseurs en combinant des analyseurs plus petits à l'aide de la composition.
Conversion des types de données vers/depuis les types Java standard.
Conversion entre les types spécifiques FunctionalJava et Java 8.
Égalité et code de hachage configurables pour HashMap et HashSet.
Implémentations de fermeture éclair pour les flux et les arbres.
Cadre de test automatisé basé sur des spécifications ( fj.test
).
Acteurs entièrement opérationnels pour les calculs parallèles ( fj.control.parallel
) et les abstractions en couches telles que parallel-map, map-reduce, parallel-zip.
Optique pour mettre à jour les données immuables, notamment l'objectif, le prisme, l'iso, l'option, la traversée, le getter, le pli et le setter. Inspiré de la bibliothèque Scala Monocle (https://github.com/julien-truffaut/Monocle) et de la bibliothèque de lentilles Haskell (https://github.com/ekmett/lens).
Void, un type logiquement inhabité.
La licence Functional Java utilise la licence BSD 3 (licence à 3 clauses) disponible sur https://en.wikipedia.org/wiki/BSD_licenses.
Pour les notes de version pour chaque version, consultez le lien du répertoire : etc/release-notes.