Functional Java ist eine Open-Source-Bibliothek, die die funktionale Programmierung in Java erleichtert. Die Bibliothek implementiert zahlreiche grundlegende und fortgeschrittene Programmierabstraktionen, die eine kompositionsorientierte Entwicklung unterstützen. Funktionales Java dient auch als Plattform zum Erlernen funktionaler Programmierkonzepte, indem diese Konzepte in einer vertrauten Sprache eingeführt werden.
Die Bibliothek ist für den Einsatz in Produktionsanwendungen gedacht und wird mithilfe der Technik des automatisierten spezifikationsbasierten Testens mit ScalaCheck und dem Quickcheck-Modul von Functional Java gründlich getestet.
Funktionales Java bietet Abstraktionen für die folgenden Typen:
Grundlegende Datenstrukturen – Gesamt- und Teilfunktionen, Produkte, Einheit, Option, unvoreingenommene und rechtsvoreingenommene Vereinigungen (entweder und Validierung), ungültig.
Unveränderliche Sammlungen – Array, Liste, Vektor, Stream, Satz, Karte, Prioritätswarteschlange, Fingerbaum, heterogene Liste, Differenzliste.
Andere Abstraktionen – Monoid, Halbgruppe, natürlich, Zufallszahlengenerator, Reader, Writer, Zustand, Eingabe/Ausgabe, Parser, Zipper, spezifikationsbasiertes Testen (Quickcheck), Akteure, Optik (Linse, Prisma, Faltung, Traversierung und andere), Parallelität und Typkonvertierung.
Wichtige URLs für das Projekt sind:
Website: http://www.Functionaljava.org
Website-Repository, http://github.com/Functionaljava/Functionaljava.github.io
Travis Continuous Integration Build, https://app.travis-ci.com/github/Functionaljava/Functionaljava
Sonatype-Repository, https://oss.sonatype.org/content/groups/public/org/Functionaljava/
Maven Central-Repository, https://mvnrepository.com/artifact/org.Functionaljava/Functionaljava
Die empfohlene Methode zum Herunterladen und Verwenden des Projekts ist Ihr Build-Tool.
Das funktionale Java-Artefakt wird in Maven Central unter Verwendung der Gruppe org.functionaljava
mit drei veröffentlichten Artefakten veröffentlicht:
die Kernbibliothek ( functionaljava
)
Eigenschaftsbasiertes Testen ( functionaljava-quickcheck
)
eine kleine Menge Java 8-Unterstützung ( functionaljava-java-core
)
Die neueste stabile Version ist 5.0
. Dies kann zu Ihrem Gradle-Projekt hinzugefügt werden, indem Sie die Abhängigkeiten hinzufügen:
kompilieren Sie „org.Functionaljava:Functionaljava:5.0“ kompilieren Sie „org.Functionaljava:Functionaljava-Quickcheck:5.0“ kompilieren Sie „org.Functionaljava:Functionaljava-Java-Core:5.0“
und in Maven:
<Abhängigkeit> <groupId>org.Functionaljava</groupId> <artifactId>Functionaljava</artifactId> <version>5.0</version> </Abhängigkeit> <Abhängigkeit> <groupId>org.Functionaljava</groupId> <artifactId>Functionaljava-Quickcheck</artifactId> <version>5.0</version> </Abhängigkeit> <Abhängigkeit> <groupId>org.Functionaljava</groupId> <artifactId>Functionaljava-Java-Core</artifactId> <version>5.0</version> </Abhängigkeit>
Die Erstellung erfolgt mit Java 8 und Gradle 7.4. Führen Sie im Stammverzeichnis Folgendes aus:
./gradlew
Dies erfordert Zugriff auf Java 8, lädt das Gradle-Build-Tool und die erforderlichen Abhängigkeiten herunter und erstellt FunctionalJava.
Eine ausführlichere Beschreibung der oben genannten Funktionen ist:
Grundlegende Datenstrukturen
Funktionen mit Arität 1 bis 8 ( fj.F
).
Funktionen mit Arität 0 bis 8, die Ausnahmen erzeugen können ( fj.Try
).
Funktionen mit einer Arität von 0 bis 8, die eine void-Rückgabe haben ( fj.Effect
).
Funktionen mit einer Arität von 0 bis 8, die eine void-Rückgabe haben und eine Ausnahme auslösen können ( fj.TryEffect
).
Produkte mit der Arität 1 bis 8 ( fj.P
).
Einheitentyp ( fj.Unit
).
Optionaler Wert – typsicherer Nullwert ( fj.data.Option
).
Disjunkter Union-Datentyp – kompositorische Ausnahmebehandlung ( fj.data.Either
).
Validierung – rechtsgerichtete kompositorische Ausnahmebehandlung ( fj.data.Validation
).
Unveränderliche Sammlungen
Array-Wrapper ( fj.data.Array
).
Unveränderliche, einfach verknüpfte Liste im Speicher ( fj.data.List
).
Unveränderliche Lazy Single Linked List ( fj.data.Stream
).
Ein Paket ( fj.data.fingertrees
), das 2-3 Fingerbäume für eine funktionale Darstellung persistenter Sequenzen bereitstellt und den Zugriff auf die Enden in amortisierter O(1)-Zeit unterstützt.
Typsichere heterogene Liste ( fj.data.hlist
) für Listen von Elementen unterschiedlichen Typs ohne Einbußen bei der Typsicherheit.
Unveränderliche Set-Implementierung mithilfe eines rot/schwarzen Baums ( fj.data.Set
).
Unveränderlicher Mehrwegebaum – auch Rosenbaum genannt ( fj.data.Tree
).
Unveränderliche Baumkarte mit einer rot/schwarzen Baumimplementierung ( fj.data.TreeMap
).
Unveränderliche Prioritätswarteschlange mithilfe von Fingerbäumen ( fj.data.PriorityQueue
).
Differenzlisten, eine hochleistungsfähige Liste.
Andere Abstraktionen
Monoid ( fj.Monoid
).
Halbgruppe ( fj.Semigroup
).
Datentyp für natürliche Zahlen ( fj.data.Natural
).
Zufallszahlengenerator unter Verwendung eines linearen Kongruenzgenerators ( fj.LcgRng
).
Reader-, Writer- und State-Monaden ( fj.data.Reader
, fj.data.Writer
, fj.data.State
).
Eingabe-/Ausgabemonade zum Abstrahieren von IO ( fj.IO
).
Monadische Parser-Kombinatoren zum Schreiben von Parsern durch Kombinieren kleinerer Parser mithilfe von Komposition.
Konvertierung von Datentypen in/von Standard-Java-Typen.
Konvertierung zwischen FunctionalJava- und Java 8-spezifischen Typen.
Konfigurierbare Gleichheit und Hash-Code für HashMap und HashSet.
Reißverschluss-Implementierungen für Bäche und Bäume.
Automatisiertes spezifikationsbasiertes Testframework ( fj.test
).
Voll funktionsfähige Akteure für parallele Berechnungen ( fj.control.parallel
) und geschichtete Abstraktionen wie Parallel-Map, Map-Reduce, Parallel-Zip.
Optik zum Aktualisieren unveränderlicher Daten, einschließlich Linse, Prisma, ISO, optional, Traversal, Getter, Fold und Setter. Inspiriert von der Scala Monocle-Bibliothek (https://github.com/julien-truffaut/Monocle) und der Haskell-Linsenbibliothek (https://github.com/ekmett/lens).
Void, ein logischerweise unbewohnter Typ.
Die Functional Java-Lizenz verwendet die BSD 3-Lizenz (3-Klausel-Lizenz), verfügbar unter https://en.wikipedia.org/wiki/BSD_licenses.
Versionshinweise für jede Version finden Sie im Verzeichnis link:etc/release-notes.