Java Fungsional adalah perpustakaan sumber terbuka yang memfasilitasi pemrograman fungsional di Java. Perpustakaan mengimplementasikan berbagai abstraksi pemrograman dasar dan lanjutan yang membantu pengembangan berorientasi komposisi. Java Fungsional juga berfungsi sebagai platform untuk mempelajari konsep pemrograman fungsional dengan memperkenalkan konsep tersebut menggunakan bahasa yang familiar.
Pustaka ini dimaksudkan untuk digunakan dalam aplikasi produksi dan diuji secara menyeluruh menggunakan teknik pengujian berbasis spesifikasi otomatis dengan ScalaCheck dan modul quickcheck Fungsional Java.
Java fungsional menyediakan abstraksi untuk tipe berikut:
Struktur Data Dasar - fungsi total dan parsial, produk, unit, opsi, gabungan yang tidak memihak dan bias kanan (baik dan validasi), tidak berlaku.
Koleksi Abadi - array, daftar, vektor, aliran, set, peta, antrian prioritas, pohon jari, daftar heterogen, daftar perbedaan.
Abstraksi Lainnya - monoid, semigrup, natural, generator bilangan acak, pembaca, penulis, status, input/output, parser, ritsleting, pengujian berbasis spesifikasi (pemeriksaan cepat), aktor, optik (lensa, prisma, lipatan, traversal, dan lainnya), konkurensi dan ketik konversi.
URL penting untuk proyek ini adalah:
Situs web, http://www.fungsionaljava.org
Repositori situs web, http://github.com/fungsionaljava/fungsionaljava.github.io
Pembuatan integrasi berkelanjutan Travis, https://app.travis-ci.com/github/functionjava/functionjava
Repositori Sonatype, https://oss.sonatype.org/content/groups/public/org/functionjava/
Repositori Maven Central, https://mvnrepository.com/artifact/org.fungsionaljava/fungsionaljava
Cara yang disarankan untuk mengunduh dan menggunakan proyek ini adalah melalui alat pembangunan Anda.
Artefak Java Fungsional diterbitkan ke Maven Central menggunakan grup org.functionaljava
dengan tiga artefak yang diterbitkan:
perpustakaan inti ( functionaljava
)
pengujian berbasis properti ( functionaljava-quickcheck
)
sejumlah kecil dukungan Java 8 ( functionaljava-java-core
)
Versi stabil terbaru adalah 5.0
. Ini dapat ditambahkan ke proyek Gradle Anda dengan menambahkan dependensi:
kompilasi "org.fungsionaljava:fungsionaljava:5.0" kompilasi "org.fungsionaljava:fungsionaljava-quickcheck:5.0" kompilasi "org.fungsionaljava:fungsionaljava-java-core:5.0"
dan di Maven:
<ketergantungan> <groupId>org.fungsionaljava</groupId> <artifactId>java fungsional</artifactId> <versi>5.0</versi> </ketergantungan> <ketergantungan> <groupId>org.fungsionaljava</groupId> <artifactId>fungsionaljava-quickcheck</artifactId> <versi>5.0</versi> </ketergantungan> <ketergantungan> <groupId>org.fungsionaljava</groupId> <artifactId>fungsionaljava-java-core</artifactId> <versi>5.0</versi> </ketergantungan>
Pembangunan dilakukan menggunakan Java 8 dan Gradle 7.4. Di direktori root jalankan:
./gradlew
Ini memerlukan akses ke Java 8 dan akan mengunduh alat pembangunan Gradle dan dependensi yang diperlukan serta membangun FunctionalJava.
Penjelasan lebih lengkap mengenai fitur-fitur yang disebutkan di atas adalah:
Struktur Data Dasar
Fungsi dengan arity 1 hingga 8 ( fj.F
).
Fungsi dengan arity 0 hingga 8 yang dapat menghasilkan pengecualian ( fj.Try
).
Fungsi dengan arity 0 hingga 8 yang memiliki void return ( fj.Effect
).
Fungsi dengan arity 0 hingga 8 yang memiliki pengembalian batal dan dapat memunculkan pengecualian ( fj.TryEffect
).
Produk dengan arity 1 hingga 8 ( fj.P
).
Jenis unit ( fj.Unit
).
Nilai opsional - tipe-safe null ( fj.data.Option
).
Tipe data gabungan terpisah - penanganan pengecualian komposisi ( fj.data.Either
).
Validasi - penanganan pengecualian komposisi yang bias kanan ( fj.data.Validation
).
Koleksi yang Tidak Dapat Diubah
Pembungkus array ( fj.data.Array
).
Daftar tertaut tunggal dalam memori yang tidak dapat diubah ( fj.data.List
).
Daftar tertaut tunggal malas yang tidak dapat diubah ( fj.data.Stream
).
Sebuah paket ( fj.data.fingertrees
) menyediakan 2-3 pohon jari untuk representasi fungsional dari urutan persisten, mendukung akses ke ujung dalam waktu O(1) yang diamortisasi.
Daftar heterogen yang aman untuk tipe ( fj.data.hlist
) untuk daftar elemen dari tipe yang berbeda tanpa mengorbankan keamanan tipe.
Implementasi set yang tidak dapat diubah menggunakan pohon merah/hitam ( fj.data.Set
).
Pohon multi-arah yang tidak dapat diubah - alias pohon mawar ( fj.data.Tree
).
Peta pohon yang tidak dapat diubah menggunakan implementasi pohon merah/hitam ( fj.data.TreeMap
).
Antrean prioritas yang tidak dapat diubah menggunakan pohon jari ( fj.data.PriorityQueue
).
Daftar perbedaan, daftar berperforma tinggi.
Abstraksi Lainnya
Monoid ( fj.Monoid
).
Semigrup ( fj.Semigroup
).
Tipe data bilangan asli ( fj.data.Natural
).
Generator bilangan acak menggunakan generator kongruensial linier ( fj.LcgRng
).
Monad Pembaca, Penulis, dan Status ( fj.data.Reader
, fj.data.Writer
, fj.data.State
).
Monad Input/Output untuk mengabstraksi IO ( fj.IO
).
Kombinator parser monadik untuk menulis parser dengan menggabungkan parser yang lebih kecil menggunakan komposisi.
Konversi tipe data ke/dari tipe Java standar.
Konversi antara tipe spesifik FunctionalJava dan Java 8.
Kesetaraan dan kode hash yang dapat dikonfigurasi untuk HashMap dan HashSet.
Implementasi ritsleting untuk sungai dan pepohonan.
Kerangka pengujian berbasis spesifikasi otomatis ( fj.test
).
Aktor yang beroperasi penuh untuk komputasi paralel ( fj.control.parallel
) dan abstraksi berlapis seperti peta paralel, pengurangan peta, zip paralel.
Optik untuk memperbarui data yang tidak dapat diubah termasuk lensa, prisma, iso, opsional, traversal, pengambil, lipatan, dan penyetel. Terinspirasi oleh perpustakaan Scala Monocle (https://github.com/julien-truffaut/Monocle) dan perpustakaan lensa Haskell (https://github.com/ekmett/lens).
Void, tipe yang secara logis tidak berpenghuni.
Lisensi Java Fungsional menggunakan lisensi BSD 3 (lisensi 3 klausa) yang tersedia di https://en.wikipedia.org/wiki/BSD_licenses.
Untuk catatan rilis setiap versi, lihat tautan direktori:etc/release-notes.