Functional Java — это библиотека с открытым исходным кодом, облегчающая функциональное программирование на Java. Библиотека реализует множество базовых и расширенных абстракций программирования, которые помогают в разработке, ориентированной на композицию. Функциональная Java также служит платформой для изучения концепций функционального программирования, знакомя их с использованием знакомого языка.
Библиотека предназначена для использования в производственных приложениях и тщательно протестирована с использованием техники автоматического тестирования на основе спецификаций с помощью ScalaCheck и модуля быстрой проверки Functional Java.
Функциональная Java предоставляет абстракции для следующих типов:
Базовые структуры данных - полные и частичные функции, продукты, единица измерения, опция, несмещенные и правосмещенные объединения (либо и проверка), недействительность.
Неизменяемые коллекции — массив, список, вектор, поток, набор, карта, очередь приоритетов, дерево пальцев, гетерогенный список, список различий.
Другие абстракции - моноид, полугруппа, натуральный, генератор случайных чисел, считыватель, писатель, состояние, ввод/вывод, парсер, молния, тестирование на основе спецификаций (быстрая проверка), актеры, оптика (линза, призма, сгиб, обход и другие), параллелизм. и преобразование типов.
Важные URL-адреса для проекта:
Веб-сайт http://www.functionaljava.org.
Репозиторий веб-сайта, http://github.com/functionaljava/functionaljava.github.io.
Сборка непрерывной интеграции Travis, https://app.travis-ci.com/github/functionaljava/functionaljava
Репозиторий Sonatype, https://oss.sonatype.org/content/groups/public/org/functionaljava/
Центральный репозиторий Maven, https://mvnrepository.com/artifact/org.functionaljava/functionaljava.
Рекомендуемый способ загрузки и использования проекта — через инструмент сборки.
Артефакт Functional Java публикуется в Maven Central с использованием группы org.functionaljava
с тремя опубликованными артефактами:
основная библиотека ( functionaljava
)
тестирование на основе свойств ( functionaljava-quickcheck
)
небольшая поддержка Java 8 ( functionaljava-java-core
)
Последняя стабильная версия — 5.0
. Это можно добавить в ваш проект Gradle, добавив зависимости:
скомпилировать "org.functionaljava:functionaljava:5.0" скомпилировать "org.functionaljava:functionaljava-quickcheck:5.0" скомпилировать "org.functionaljava:functionaljava-java-core:5.0"
и в Maven:
<зависимость> <groupId>org.functionaljava</groupId> <artifactId>функциональная Java</artifactId> <версия>5.0</версия> </зависимость> <зависимость> <groupId>org.functionaljava</groupId> <artifactId>функциональная быстрая проверка Java</artifactId> <версия>5.0</версия> </зависимость> <зависимость> <groupId>org.functionaljava</groupId> <artifactId>функциональное Java-ядро</artifactId> <версия>5.0</версия> </зависимость>
Сборка осуществляется с использованием Java 8 и Gradle 7.4. В корневом каталоге выполните:
./градлев
Для этого требуется доступ к Java 8, загрузка инструмента сборки Gradle и необходимые зависимости и сборка FunctionalJava.
Более полное описание упомянутых выше функций:
Базовые структуры данных
Функции с арностью от 1 до 8 ( fj.F
).
Функции с арностью от 0 до 8, которые могут создавать исключения ( fj.Try
).
Функции с арностью от 0 до 8, возвращающие void ( fj.Effect
).
Функции с арностью от 0 до 8, которые возвращают значение void и могут генерировать исключение ( fj.TryEffect
).
Товары с арностью от 1 до 8 ( fj.P
).
Тип юнита ( fj.Unit
).
Необязательное значение — типобезопасное значение null ( fj.data.Option
).
Тип данных несвязного объединения — композиционная обработка исключений ( fj.data.Either
).
Валидация — композиционная обработка исключений со смещением вправо ( fj.data.Validation
).
Неизменяемые коллекции
Обертка массива ( fj.data.Array
).
Неизменяемый односвязный список в памяти ( fj.data.List
).
Неизменяемый ленивый односвязный список ( fj.data.Stream
).
Пакет ( fj.data.fingertrees
), предоставляющий 2-3 пальцевых дерева для функционального представления постоянных последовательностей, поддерживающий доступ к концам за амортизированное время O(1).
Типобезопасный гетерогенный список ( fj.data.hlist
) для списков элементов разных типов без ущерба для безопасности типов.
Реализация неизменяемого набора с использованием красного/черного дерева ( fj.data.Set
).
Неизменяемое многопутевое дерево — оно же розовое дерево ( fj.data.Tree
).
Неизменяемая древовидная карта с использованием реализации красного/черного дерева ( fj.data.TreeMap
).
Неизменяемая очередь приоритетов с использованием пальцевых деревьев ( fj.data.PriorityQueue
).
Списки отличий, высокопроизводительный список.
Другие абстракции
Моноид ( fj.Monoid
).
Полугруппа ( fj.Semigroup
).
Тип данных «Натуральное число» ( fj.data.Natural
).
Генератор случайных чисел с использованием линейного конгруэнтного генератора ( fj.LcgRng
).
Монады Reader, Writer и State ( fj.data.Reader
, fj.data.Writer
, fj.data.State
).
Монада ввода/вывода для абстрагирования ввода-вывода ( fj.IO
).
Комбинаторы монадических парсеров для написания парсеров путем объединения более мелких парсеров с помощью композиции.
Преобразование типов данных в/из стандартных типов Java.
Преобразование между типами FunctionalJava и Java 8.
Настраиваемое равенство и хэш-код для HashMap и HashSet.
Реализации Zipper для потоков и деревьев.
Платформа автоматизированного тестирования на основе спецификаций ( fj.test
).
Полностью работоспособные актеры для параллельных вычислений ( fj.control.parallel
) и многоуровневых абстракций, таких как параллельная карта, карта-редукция, параллельный zip.
Оптика для обновления неизменяемых данных, включая линзу, призму, ISO, опционально, обход, геттер, складку и сеттер. Вдохновлен библиотекой Scala Monocle (https://github.com/julien-truffaut/Monocle) и библиотекой линз Haskell (https://github.com/ekmett/lens).
Пустота, логически необитаемый тип.
В лицензии Functional Java используется лицензия BSD 3 (лицензия из 3 пунктов), доступная по адресу https://en.wikipedia.org/wiki/BSD_licenses.
Примечания к выпуску для каждой версии см. в каталоге link:etc/release-notes.