Functional Java é uma biblioteca de código aberto que facilita a programação funcional em Java. A biblioteca implementa inúmeras abstrações de programação básicas e avançadas que auxiliam no desenvolvimento orientado à composição. Java Funcional também serve como plataforma para aprender conceitos de programação funcional, introduzindo esses conceitos usando uma linguagem familiar.
A biblioteca destina-se ao uso em aplicativos de produção e é exaustivamente testada usando a técnica de teste automatizado baseado em especificações com ScalaCheck e módulo quickcheck do Functional Java.
Java funcional fornece abstrações para os seguintes tipos:
Estruturas de dados básicas - funções totais e parciais, produtos, unidade, opção, uniões imparciais e tendenciosas à direita (ou validação), nulas.
Coleções imutáveis - array, lista, vetor, fluxo, conjunto, mapa, fila de prioridade, árvore de dedos, lista heterogênea, lista de diferenças.
Outras abstrações - monóide, semigrupo, natural, gerador de números aleatórios, leitor, gravador, estado, entrada/saída, analisador, zíper, testes baseados em especificações (verificação rápida), atores, óptica (lente, prisma, dobra, travessia e outros), simultaneidade e conversão de tipo.
URLs importantes para o projeto são:
Site, http://www.funcionaljava.org
Repositório do site, http://github.com/funcionaljava/funcionaljava.github.io
Construção de integração contínua do Travis, https://app.travis-ci.com/github/funcionaljava/funcionaljava
Repositório Sonatype, https://oss.sonatype.org/content/groups/public/org/funcionaljava/
Repositório Maven Central, https://mvnrepository.com/artifact/org.funcionaljava/funcionaljava
A forma recomendada de baixar e usar o projeto é por meio da ferramenta de construção.
O artefato Functional Java é publicado no Maven Central usando o grupo org.functionaljava
com três artefatos publicados:
a biblioteca principal ( functionaljava
)
teste baseado em propriedade ( functionaljava-quickcheck
)
uma pequena quantidade de suporte a Java 8 ( functionaljava-java-core
)
A versão estável mais recente é 5.0
. Isso pode ser adicionado ao seu projeto Gradle adicionando as dependências:
compilar "org.funcionaljava:funcionaljava:5.0" compilar "org.funcionaljava:funcionaljava-quickcheck:5.0" compilar "org.funcionaljava:funcionaljava-java-core:5.0"
e em Maven:
<dependência> <groupId>org.funcionaljava</groupId> <artifactId>funcionaljava</artifactId> <versão>5.0</versão> </dependency> <dependência> <groupId>org.funcionaljava</groupId> <artifactId>funcionaljava-quickcheck</artifactId> <versão>5.0</versão> </dependency> <dependência> <groupId>org.funcionaljava</groupId> <artifactId>funcionaljava-java-core</artifactId> <versão>5.0</versão> </dependency>
A construção é feita usando Java 8 e Gradle 7.4. No diretório raiz execute:
./gradlew
Isso requer acesso ao Java 8 e fará o download da ferramenta de compilação Gradle e das dependências necessárias e criará o FunctionalJava.
Uma descrição mais completa dos recursos mencionados acima é:
Estruturas de dados básicas
Funções com aridade de 1 a 8 ( fj.F
).
Funções com aridade de 0 a 8 que podem produzir exceções ( fj.Try
).
Funções com aridade de 0 a 8 que possuem retorno nulo ( fj.Effect
).
Funções com aridade de 0 a 8 que possuem retorno nulo e podem lançar uma exceção ( fj.TryEffect
).
Produtos com aridade de 1 a 8 ( fj.P
).
Tipo de unidade ( fj.Unit
).
Valor opcional - nulo com segurança de tipo ( fj.data.Option
).
Tipo de dados de união disjunta - tratamento de exceção de composição ( fj.data.Either
).
Validação - tratamento de exceções composicionais com tendência à direita ( fj.data.Validation
).
Coleções imutáveis
Wrapper de matriz ( fj.data.Array
).
Lista imutável, vinculada individualmente na memória ( fj.data.List
).
Lista preguiçosa imutável unida individualmente ( fj.data.Stream
).
Um pacote ( fj.data.fingertrees
) que fornece 2-3 árvores de dedos para uma representação funcional de sequências persistentes, suportando acesso às extremidades em tempo O(1) amortizado.
Lista heterogênea com segurança de tipo ( fj.data.hlist
) para listas de elementos de tipos diferentes sem sacrificar a segurança de tipo.
Implementação de conjunto imutável usando uma árvore vermelha/preta ( fj.data.Set
).
Árvore imutável de múltiplas vias - também conhecida como roseira ( fj.data.Tree
).
Mapa de árvore imutável usando uma implementação de árvore vermelha/preta ( fj.data.TreeMap
).
Fila de prioridade imutável usando árvores de dedos ( fj.data.PriorityQueue
).
Listas de diferenças, uma lista de alto desempenho.
Outras abstrações
Monóide ( fj.Monoid
).
Semigrupo ( fj.Semigroup
).
Tipo de dados de número natural ( fj.data.Natural
).
Gerador de números aleatórios usando um gerador congruente linear ( fj.LcgRng
).
Mônadas Leitor, Escritor e Estado ( fj.data.Reader
, fj.data.Writer
, fj.data.State
).
Mônada de entrada/saída para abstrair IO ( fj.IO
).
Combinadores de analisadores monádicos para escrever analisadores combinando analisadores menores usando composição.
Conversão de tipos de dados de/para tipos Java padrão.
Conversão entre tipos específicos FunctionalJava e Java 8.
Igualdade configurável e código hash para HashMap e HashSet.
Implementações de Zipper para fluxos e árvores.
Estrutura de teste automatizado baseado em especificações ( fj.test
).
Atores totalmente operacionais para cálculos paralelos ( fj.control.parallel
) e abstrações em camadas, como mapa paralelo, redução de mapa, zip paralelo.
Óptica para atualização de dados imutáveis, incluindo lente, prisma, iso, opcional, passagem, getter, dobra e setter. Inspirado na biblioteca Scala Monocle (https://github.com/julien-truffaut/Monocle) e na biblioteca de lentes Haskell (https://github.com/ekmett/lens).
Vazio, um tipo logicamente desabitado.
A licença Functional Java usa a licença BSD 3 (licença de 3 cláusulas) disponível em https://en.wikipedia.org/wiki/BSD_licenses.
Para notas de lançamento de cada versão, consulte o diretório link:etc/release-notes.