Functional Java es una biblioteca de código abierto que facilita la programación funcional en Java. La biblioteca implementa numerosas abstracciones de programación básicas y avanzadas que ayudan al desarrollo orientado a la composición. Java funcional también sirve como plataforma para aprender conceptos de programación funcional al presentarlos utilizando un lenguaje familiar.
La biblioteca está diseñada para su uso en aplicaciones de producción y se prueba minuciosamente utilizando la técnica de pruebas automatizadas basadas en especificaciones con ScalaCheck y el módulo Quickcheck de Functional Java.
Java funcional proporciona abstracciones para los siguientes tipos:
Estructuras de datos básicas: funciones totales y parciales, productos, unidad, opción, uniones imparciales y sesgadas hacia la derecha (ya sea y validación), nulas.
Colecciones inmutables: matriz, lista, vector, secuencia, conjunto, mapa, cola de prioridad, árbol de dedos, lista heterogénea, lista de diferencias.
Otras abstracciones: monoide, semigrupo, natural, generador de números aleatorios, lector, escritor, estado, entrada/salida, analizador, cremallera, pruebas basadas en especificaciones (verificación rápida), actores, óptica (lente, prisma, pliegue, recorrido y otros), concurrencia. y conversión de tipos.
Las URL importantes para el proyecto son:
Sitio web, http://www.functionaljava.org
Repositorio del sitio web, http://github.com/functionaljava/functionaljava.github.io
Construcción de integración continua de Travis, https://app.travis-ci.com/github/functionaljava/functionaljava
Repositorio de Sonatype, https://oss.sonatype.org/content/groups/public/org/functionaljava/
Repositorio central de Maven, https://mvnrepository.com/artifact/org.functionaljava/functionaljava
La forma recomendada de descargar y utilizar el proyecto es a través de su herramienta de compilación.
El artefacto de Java funcional se publica en Maven Central mediante el grupo org.functionaljava
con tres artefactos publicados:
la biblioteca principal ( functionaljava
)
Pruebas basadas en propiedades ( functionaljava-quickcheck
)
una pequeña cantidad de soporte para Java 8 ( functionaljava-java-core
)
La última versión estable es 5.0
. Esto se puede agregar a su proyecto Gradle agregando las dependencias:
compilar "org.functionaljava:functionaljava:5.0" compilar "org.functionaljava:functionaljava-quickcheck:5.0" compilar "org.functionaljava:functionaljava-java-core:5.0"
y en Maven:
<dependencia> <groupId>org.functionaljava</groupId> <artifactId>Java funcional</artifactId> <versión>5.0</versión> </dependencia> <dependencia> <groupId>org.functionaljava</groupId> <artifactId>comprobación rápida de java funcional</artifactId> <versión>5.0</versión> </dependencia> <dependencia> <groupId>org.functionaljava</groupId> <artifactId>funcionaljava-java-core</artifactId> <versión>5.0</versión> </dependencia>
La construcción se realiza utilizando Java 8 y Gradle 7.4. En el directorio raíz ejecute:
./gradlew
Esto requiere acceso a Java 8 y descargará la herramienta de compilación Gradle y las dependencias necesarias y compilará FunctionalJava.
Una descripción más completa de las características mencionadas anteriormente son:
Estructuras de datos básicas
Funciones con aridad 1 a 8 ( fj.F
).
Funciones con aridad de 0 a 8 que pueden producir excepciones ( fj.Try
).
Funciones con aridad de 0 a 8 que tienen un retorno nulo ( fj.Effect
).
Funciones con aridad de 0 a 8 que tienen un retorno nulo y pueden generar una excepción ( fj.TryEffect
).
Productos con aridad 1 a 8 ( fj.P
).
Tipo de unidad ( fj.Unit
).
Valor opcional: nulo con seguridad de tipos ( fj.data.Option
).
Tipo de datos de unión disjuntos: manejo de excepciones de composición ( fj.data.Either
).
Validación: manejo de excepciones de composición sesgado hacia la derecha ( fj.data.Validation
).
Colecciones inmutables
Envoltorio de matriz ( fj.data.Array
).
Lista enlazada individualmente en memoria, inmutable ( fj.data.List
).
Lista enlazada individualmente diferida inmutable ( fj.data.Stream
).
Un paquete ( fj.data.fingertrees
) que proporciona 2 o 3 árboles de dedos para una representación funcional de secuencias persistentes, lo que admite el acceso a los extremos en tiempo O(1) amortizado.
Lista heterogénea con seguridad de tipos ( fj.data.hlist
) para listas de elementos de diferentes tipos sin sacrificar la seguridad de tipos.
Implementación de conjunto inmutable utilizando un árbol rojo/negro ( fj.data.Set
).
Árbol multidireccional inmutable, también conocido como árbol de rosas ( fj.data.Tree
).
Mapa de árbol inmutable que utiliza una implementación de árbol rojo/negro ( fj.data.TreeMap
).
Cola de prioridad inmutable que utiliza árboles de dedos ( fj.data.PriorityQueue
).
Listas de diferencias, una lista de alto rendimiento.
Otras abstracciones
Monoide ( fj.Monoid
).
Semigrupo ( fj.Semigroup
).
Tipo de datos de números naturales ( fj.data.Natural
).
Generador de números aleatorios utilizando un generador congruente lineal ( fj.LcgRng
).
Mónadas Lector, Escritor y Estado ( fj.data.Reader
, fj.data.Writer
, fj.data.State
).
Mónada de entrada/salida para abstraer IO ( fj.IO
).
Combinadores de analizadores monádicos para escribir analizadores combinando analizadores más pequeños mediante composición.
Conversión de tipos de datos a/desde tipos Java estándar.
Conversión entre tipos específicos de FunctionalJava y Java 8.
Igualdad configurable y código hash para HashMap y HashSet.
Implementaciones de cremalleras para arroyos y árboles.
Marco de pruebas automatizado basado en especificaciones ( fj.test
).
Actores totalmente operativos para cálculos paralelos ( fj.control.parallel
) y abstracciones en capas como mapa paralelo, reducción de mapa, zip paralelo.
Ópticas para actualizar datos inmutables que incluyen lentes, prismas, iso, opcionales, transversales, captadores, plegadores y configuradores. Inspirado en la biblioteca Scala Monocle (https://github.com/julien-truffaut/Monocle) y la biblioteca de lentes Haskell (https://github.com/ekmett/lens).
Vacío, un tipo lógicamente deshabitado.
La licencia Java funcional utiliza la licencia BSD 3 (licencia de 3 cláusulas) disponible en https://en.wikipedia.org/wiki/BSD_licenses.
Para ver las notas de la versión de cada versión, consulte el enlace del directorio:etc/release-notes.