{"id":15045624,"url":"https://github.com/tlinkowski/unij","last_synced_at":"2025-06-24T16:04:39.381Z","repository":{"id":54803758,"uuid":"155060194","full_name":"tlinkowski/UniJ","owner":"tlinkowski","description":"Universal facade of JDK 9+ API, focused on Collection factory methods","archived":true,"fork":false,"pushed_at":"2021-01-28T15:16:44.000Z","size":718,"stargazers_count":15,"open_issues_count":5,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-04T01:24:01.793Z","etag":null,"topics":["backport","collectors","facade","immutable-collections","java","jdk","jdk11","jdk8","library"],"latest_commit_sha":null,"homepage":"http://unij.tlinkowski.pl/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tlinkowski.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-28T10:45:59.000Z","updated_at":"2024-01-07T00:01:48.000Z","dependencies_parsed_at":"2022-08-14T03:20:39.756Z","dependency_job_id":null,"html_url":"https://github.com/tlinkowski/UniJ","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/tlinkowski/UniJ","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlinkowski%2FUniJ","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlinkowski%2FUniJ/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlinkowski%2FUniJ/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlinkowski%2FUniJ/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tlinkowski","download_url":"https://codeload.github.com/tlinkowski/UniJ/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlinkowski%2FUniJ/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261710401,"owners_count":23198126,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backport","collectors","facade","immutable-collections","java","jdk","jdk11","jdk8","library"],"created_at":"2024-09-24T20:52:05.798Z","updated_at":"2025-06-24T16:04:39.046Z","avatar_url":"https://github.com/tlinkowski.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UniJ: Universal JDK 9+ API Facade\n\n[![Build (Linux)](https://img.shields.io/travis/com/tlinkowski/UniJ/master?logo=linux)](https://travis-ci.com/tlinkowski/UniJ)\n[![Build (Windows)](https://img.shields.io/appveyor/ci/tlinkowski/UniJ/master?logo=windows)](https://ci.appveyor.com/project/tlinkowski/UniJ/branch/master)\n[![Code coverage](https://img.shields.io/codecov/c/github/tlinkowski/UniJ)](https://codecov.io/gh/tlinkowski/UniJ)\n[![Codacy grade](https://img.shields.io/codacy/grade/dce6004af0d44fb7939ec3f377fe0bbe)](https://app.codacy.com/project/tlinkowski/UniJ/dashboard)\n\n[![Maven Central](https://img.shields.io/maven-central/v/pl.tlinkowski.unij/pl.tlinkowski.unij.api?label=Maven%20Central)](https://search.maven.org/search?q=g:pl.tlinkowski.unij)\n[![Javadocs](https://javadoc.io/badge/pl.tlinkowski.unij/pl.tlinkowski.unij.api.svg?color=blue)](https://javadoc.io/doc/pl.tlinkowski.unij/pl.tlinkowski.unij.api)\n[![Semantic Versioning](https://img.shields.io/badge/-semantic%20versioning-333333)](https://semver.org/)\n[![Automated Release Notes by gren](https://img.shields.io/badge/%F0%9F%A4%96-release%20notes-00B2EE)](https://github-tools.github.io/github-release-notes/)\n\n## Introduction\n\nUniJ targets JDK 8 and is a **facade** of:\n\n1.  unmodifiable [`List`](https://docs.oracle.com/javase/10/docs/api/java/util/List.html#unmodifiable)/[`Set`](https://docs.oracle.com/javase/10/docs/api/java/util/Set.html#unmodifiable)/[`Map`](https://docs.oracle.com/javase/10/docs/api/java/util/Map.html#unmodifiable)\n    factory methods (equivalent to those introduced in JDK 9+)\n\n2.  some new [`Collector`](https://docs.oracle.com/javase/10/docs/api/java/util/stream/Collectors.html) providers\n    (equivalent to those introduced in JDK 9+)\n\nUniJ provides a facade of above-mentioned methods in a similar way that [SLF4J](https://www.slf4j.org/)\n(Simple Logging Facade for Java) provides a facade of logging. In both cases, there is an API that\ncan be implemented in many different ways and then be injected at runtime as a\n[Java service](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html).\n\nUniJ consists of three key parts described further on: its **API**, its **bindings**, and its **bundles**.\n\n*Note*: if you look for a specific UniJ project, consult [UniJ project layout](docs/EXTRA.md#project-layout).\n\n### Analogy\n\n\u003e UniJ is to new parts of JDK 9+ API what [SLF4J](https://www.slf4j.org/) is to logging API — a **facade**.\n\n### Quick Example\n\n\u003cdetails open\u003e\n\u003csummary\u003eJDK 9+\u003c/summary\u003e\n\n```java\nSet\u003cInteger\u003e set = Set.of(1, 2);\nList\u003cInteger\u003e list = List.of(1, 2, 1);\nMap\u003cInteger, String\u003e map = Map.of(1, \"a\", 2, \"b\");\n\nSet.copyOf(list); // ⇒ [1, 2]\nSet.of(1, 2, 1); // throws \"duplicate element\" exception\nSet.of(1, 2, null); // throws null-pointer exception\n```\n\n\u003c/details\u003e\n\n\u003cdetails open\u003e\n\u003csummary\u003eUniJ (JDK 8+)\u003c/summary\u003e\n\n```java\nSet\u003cInteger\u003e set = UniSets.of(1, 2);\nList\u003cInteger\u003e list = UniLists.of(1, 2, 1);\nMap\u003cInteger, String\u003e map = UniMaps.of(1, \"a\", 2, \"b\");\n\nUniSets.copyOf(list); // ⇒ [1, 2]\nUniSets.of(1, 2, 1); // throws \"duplicate element\" exception\nUniSets.of(1, 2, null); // throws null-pointer exception\n```\n\n\u003c/details\u003e\n\n### Notes\n\n1.  UniJ is meant **only** as a facade of the **official JDK APIs**. UniJ will **not** introduce any\n    APIs of its own design. UniJ may **only** introduce new APIs that directly correspond to APIs in the latest stable\n    release of the JDK (currently, it's [JDK 13](https://openjdk.java.net/projects/jdk/13/)).\n\n2.  UniJ is also a partial:\n    -   [backport of JDK 9+ to JDK 8](docs/EXTRA.md#backport-of-java-9-to-java-8)\n    -   [proxy for Guava and Eclipse Collections](#collection-factory-api-bindings)\n\n## Method Summary\n\n\u003ctable\u003e\n\n  \u003ctr\u003e\n    \u003cth colspan=\"2\"\u003eJDK 9+\u003c/th\u003e\u003cth colspan=\"2\"\u003eUniJ (JDK 8+)\u003c/th\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cem\u003etype\u003c/em\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" colspan=\"2\"\u003e\u003cem\u003estatic method name\u003c/em\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cem\u003etype\u003c/em\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://docs.oracle.com/javase/10/docs/api/java/util/List.html#method.summary\"\u003e\u003ccode\u003eList\u003c/code\u003e\u003c/a\u003e\u003cbr\u003e\n      \u003ca href=\"https://docs.oracle.com/javase/10/docs/api/java/util/Set.html#method.summary\"\u003e\u003ccode\u003eSet\u003c/code\u003e\u003c/a\u003e\u003cbr\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" colspan=\"2\"\u003e\u003ccode\u003eof\u003c/code\u003e, \u003ccode\u003ecopyOf\u003c/code\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://static.javadoc.io/pl.tlinkowski.unij/pl.tlinkowski.unij.api/0.1.1/pl.tlinkowski.unij.api/pl/tlinkowski/unij/api/UniLists.html#method.summary\"\u003e\u003ccode\u003eUniLists\u003c/code\u003e\u003c/a\u003e\u003cbr\u003e\n      \u003ca href=\"https://static.javadoc.io/pl.tlinkowski.unij/pl.tlinkowski.unij.api/0.1.1/pl.tlinkowski.unij.api/pl/tlinkowski/unij/api/UniSets.html#method.summary\"\u003e\u003ccode\u003eUniSets\u003c/code\u003e\u003c/a\u003e\u003cbr\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://docs.oracle.com/javase/10/docs/api/java/util/Map.html#method.summary\"\u003e\u003ccode\u003eMap\u003c/code\u003e\u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" colspan=\"2\"\u003e\n      \u003ccode\u003eof\u003c/code\u003e, \u003ccode\u003ecopyOf\u003c/code\u003e,\u003cbr\u003e\n      \u003ccode\u003eentry\u003c/code\u003e, \u003ccode\u003eofEntries\u003c/code\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://static.javadoc.io/pl.tlinkowski.unij/pl.tlinkowski.unij.api/0.1.1/pl.tlinkowski.unij.api/pl/tlinkowski/unij/api/UniMaps.html#method.summary\"\u003e\u003ccode\u003eUniMaps\u003c/code\u003e\u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://docs.oracle.com/javase/10/docs/api/java/util/stream/Collectors.html#method.summary\"\u003e\u003ccode\u003eCollectors\u003c/code\u003e\u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" colspan=\"2\"\u003e\n      \u003ccode\u003etoUnmodifiableList\u003c/code\u003e\u003cbr\u003e\n      \u003ccode\u003etoUnmodifiableSet\u003c/code\u003e\u003cbr\u003e\n      \u003ccode\u003etoUnmodifiableMap\u003c/code\u003e\u003cbr\u003e\n      \u003ccode\u003efiltering\u003c/code\u003e\u003cbr\u003e\n      \u003ccode\u003eflatMapping\u003c/code\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://static.javadoc.io/pl.tlinkowski.unij/pl.tlinkowski.unij.api/0.1.1/pl.tlinkowski.unij.api/pl/tlinkowski/unij/api/UniCollectors.html#method.summary\"\u003e\u003ccode\u003eUniCollectors\u003c/code\u003e\u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n\u003c/table\u003e\n\n## Motivation\n\nThis library has been designed primarily for:\n\n1.  [End Users Stuck on JDK 8](#end-users-stuck-on-jdk-8)\n2.  [Libraries Targeting JDK 8](#libraries-targeting-jdk-8)\n\n### End Users Stuck on JDK 8\n\nIf you're stuck on JDK 8, you can't use JDK 9+'s [new methods](#method-summary) like `List.of`, etc.\n\nHowever, by adding a dependency on a UniJ bundle of your choosing (plus some optional extra dependencies),\nyou can enjoy a JDK 11-like API on JDK 8!\n\n**See**:\n-   [Usage for End Users](docs/USAGE.md#implementation-for-end-users)\n-   [Q\u0026A for End Users](docs/Q-and-A.md#end-user-qa)\n-   [sample end-user projects](subprojects/samples/enduser)\n\n### Libraries Targeting JDK 8\n\nIf you maintain a library targeting JDK 8, you can't use JDK 9+'s [new methods](#method-summary) like `List.of`, etc.\n\nHowever, by adding a dependency on UniJ [User API](#user-api), you can program to JDK 11-like API!\n\n*Note*: your users will have to provide implementations of the above-mentioned API\n(as per [Usage for End Users](docs/USAGE.md#implementation-for-end-users)).\n\n**See**:\n-   [Usage for Library Providers](docs/USAGE.md#user-api-for-library-providers)\n-   [Q\u0026A for Library Providers](docs/Q-and-A.md#library-provider-qa)\n-   [sample library projects](subprojects/samples/lib)\n\n## API\n\nUniJ has two kind of [APIs](subprojects/api):\n-   [User API](#user-api): utility classes (this is what the user interacts with)\n-   [Service API](#service-api): interfaces (this is what the service provider implements)\n\nThe call chain looks as follows:\n```text\nend user ⟷ User API ⟷ Service API ⟷ service provider\n```\n\nIn other words, the end user isn't aware of the [Service API](#service-api),\nand the service provider isn't aware of the [User API](#user-api).\n\n### User API\n\nThe User API is defined in [`pl.tlinkowski.unij.api`](subprojects/api/pl.tlinkowski.unij.api) and consists of the\nfollowing utility classes: `UniLists`, `UniSets`, `UniMaps` and `UniCollectors`\n(see [Method Summary](#method-summary) for details).\n\nThis API has strict equivalence to the corresponding JDK API (see [API Specification](#api-specification) for details).\n\n### Service API\n\n*Disclaimer: As an end user, you **don't** need to be concerned with this API.*\n\nUniJ Service API is defined in [`pl.tlinkowski.unij.service.api`](subprojects/api/pl.tlinkowski.unij.service.api)\nand consists of the following interfaces:\n\n-   `Collection` factories:\n    [`UnmodifiableListFactory`](subprojects/api/pl.tlinkowski.unij.service.api/src/main/java/pl/tlinkowski/unij/service/api/collect/UnmodifiableListFactory.java),\n    [`UnmodifiableSetFactory`](subprojects/api/pl.tlinkowski.unij.service.api/src/main/java/pl/tlinkowski/unij/service/api/collect/UnmodifiableSetFactory.java),\n    [`UnmodifiableMapFactory`](subprojects/api/pl.tlinkowski.unij.service.api/src/main/java/pl/tlinkowski/unij/service/api/collect/UnmodifiableMapFactory.java)\n\n-   miscellaneous:\n    [`MiscellaneousApiProvider`](subprojects/api/pl.tlinkowski.unij.service.api/src/main/java/pl/tlinkowski/unij/service/api/misc/MiscellaneousApiProvider.java)\n\nA module providing implementations of one or more of these interfaces constitutes a [binding](#bindings).\n\n### API Specification\n\nUniJ APIs come with a detailed specification for the [Service API](#service-api) interfaces. The specification is based\non the contract of the original JDK API (expressed mostly in JavaDoc), and tries to follow it as close as possible.\n\nThe focal points of the specification are:\n-   `null` treatment (no `null`s allowed)\n-   duplicate handling (e.g. no duplicates allowed in `of` methods of `UniSets` and `UniMaps`)\n-   consistency (e.g. only one empty collection instance)\n\nThe specification is fully expressed as the following [Spock](http://spockframework.org/) test classes defined\n[`pl.tlinkowski.unij.test`](subprojects/pl.tlinkowski.unij.test):\n\n-   `Collection` factories:\n    [`UnmodifiableListFactorySpec`](subprojects/pl.tlinkowski.unij.test/src/main/groovy/pl/tlinkowski/unij/test/service/collect/UnmodifiableListFactorySpec.groovy),\n    [`UnmodifiableSetFactorySpec`](subprojects/pl.tlinkowski.unij.test/src/main/groovy/pl/tlinkowski/unij/test/service/collect/UnmodifiableSetFactorySpec.groovy),\n    [`UnmodifiableMapFactorySpec`](subprojects/pl.tlinkowski.unij.test/src/main/groovy/pl/tlinkowski/unij/test/service/collect/UnmodifiableMapFactorySpec.groovy)\n\n-   miscellaneous:\n    [`MiscellaneousApiProviderSpec`](subprojects/pl.tlinkowski.unij.test/src/main/groovy/pl/tlinkowski/unij/test/service/misc/MiscellaneousApiProviderSpec.groovy)\n\nRead the source of the Spock tests linked above to see what *every* UniJ binding guarantees.\n\n## Bindings\n\nA binding is simply a library with implementation(s) of the [Service API](#service-api).\n\nNote that [UniJ supports multiple bindings of the same type at runtime](docs/Q-and-A.md#multiple-bindings-at-runtime). \n\n### Predefined Bindings\n\nUniJ comes with a number of predefined bindings, which can all be found under\n[`subprojects/bindings`](subprojects/bindings).\n\n#### Collection Factory API Bindings\n\nUniJ currently provides four types of `Collection` factory API bindings:\n\n1.  **JDK 10** ([`pl.tlinkowski.unij.service.collect.jdk10`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.jdk10))\n\n    -   simply forwards all calls to the JDK\n\n    -   example: [`Jdk10UnmodifiableListFactory`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.jdk10/src/main/java/pl/tlinkowski/unij/service/collect/jdk10/Jdk10UnmodifiableListFactory.java)\n\n2.  **JDK 8** ([`pl.tlinkowski.unij.service.collect.jdk8`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.jdk8))\n\n    -   provides regular mutable JDK 8 collections wrapped using\n        [`Collections.unmodifiableList/Set/Map`](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableList-java.util.List-)\n\n    -   example: [`Jdk8UnmodifiableListFactory`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.jdk8/src/main/java/pl/tlinkowski/unij/service/collect/jdk8/Jdk8UnmodifiableListFactory.java)\n\n3.  [**Guava**](https://github.com/google/guava) ([`pl.tlinkowski.unij.service.collect.guava`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.guava))\n\n    -   provides Guava's [`ImmutableList`](https://guava.dev/releases/28.0-jre/api/docs/com/google/common/collect/ImmutableList.html)/[`ImmutableSet`](https://guava.dev/releases/28.0-jre/api/docs/com/google/common/collect/ImmutableSet.html)/[`ImmutableMap`](https://guava.dev/releases/28.0-jre/api/docs/com/google/common/collect/ImmutableMap.html)\n        implementations\n\n    -   example: [`GuavaUnmodifiableListFactory`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.guava/src/main/java/pl/tlinkowski/unij/service/collect/guava/GuavaUnmodifiableListFactory.java)\n\n    -   note: Guava is a compile-only dependency for this binding\n        (see [Guava / Eclipse Collections](docs/USAGE.md#guava--eclipse-collections) for details)\n\n4.  [**Eclipse Collections**](https://www.eclipse.org/collections/) ([`pl.tlinkowski.unij.service.collect.eclipse`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.eclipse))\n\n    -   provides Eclipse's [`ImmutableList`](https://www.eclipse.org/collections/javadoc/10.0.0/org/eclipse/collections/api/list/ImmutableList.html)/[`ImmutableSet`](https://www.eclipse.org/collections/javadoc/10.0.0/org/eclipse/collections/api/set/ImmutableSet.html)/[`ImmutableMap`](https://www.eclipse.org/collections/javadoc/10.0.0/org/eclipse/collections/api/map/ImmutableMap.html)\n        implementations\n\n    -   example: [`EclipseUnmodifiableListFactory`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.eclipse/src/main/java/pl/tlinkowski/unij/service/collect/eclipse/EclipseUnmodifiableListFactory.java)\n\n    -   note: Eclipse Collections is a compile-only dependency for this binding\n        (see [Guava / Eclipse Collections](docs/USAGE.md#guava--eclipse-collections) for details)\n\n#### Miscellaneous API Bindings\n\nUniJ currently provides two types of miscellaneous API bindings:\n\n1.  **JDK 11** ([`pl.tlinkowski.unij.service.misc.jdk11`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk11))\n\n    -   simply forwards all calls to the JDK\n\n    -   example: [`Jdk11MiscellaneousApiProvider`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk11/src/main/java/pl/tlinkowski/unij/service/misc/jdk11/Jdk11MiscellaneousApiProvider.java)\n\n2.  **JDK 8** ([`pl.tlinkowski.unij.service.misc.jdk8`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk8))\n\n    -   provides custom implementations based on the ones in JDK 11\n\n    -   example: [`Jdk8MiscellaneousApiProvider`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk8/src/main/java/pl/tlinkowski/unij/service/misc/jdk8/Jdk8MiscellaneousApiProvider.java)\n\n### Custom Bindings\n\nInstead of any of the [predefined bindings](#predefined-bindings) mentioned above,\nyou can create and depend on a *custom binding*.\n\n**See**:\n-   [Usage for Custom Binding Providers](docs/USAGE.md#service-api-for-custom-binding-providers)\n-   [Q\u0026A for Custom Binding Providers](docs/Q-and-A.md#custom-service-provider-qa)\n\n## Bundles\n\nA UniJ bundle is a module having no source (save for its `module-info.java`) and depending on the following three modules:\n\n1.  [`pl.tlinkowski.unij.api`](subprojects/api/pl.tlinkowski.unij.api) module (transitive dependency)\n2.  `Collection` factory API binding (= one of `pl.tlinkowski.unij.service.collect.___` modules)\n3.  miscellaneous API binding (= one of `pl.tlinkowski.unij.service.misc.___` modules)\n\n### Predefined Bundles\n\nCurrently, UniJ provides the following four [bundles](subprojects/bundles):\n\n1.  **JDK 11** bundle ([`pl.tlinkowski.unij.bundle.jdk11`](subprojects/bundles/pl.tlinkowski.unij.bundle.jdk11)), made of:\n    -   [`pl.tlinkowski.unij.service.collect.jdk10`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.jdk10)\n    -   [`pl.tlinkowski.unij.service.misc.jdk11`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk11)\n\n2.  **pure JDK 8** bundle ([`pl.tlinkowski.unij.bundle.jdk8`](subprojects/bundles/pl.tlinkowski.unij.bundle.jdk8)), made of:\n    -   [`pl.tlinkowski.unij.service.collect.jdk8`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.jdk8)\n    -   [`pl.tlinkowski.unij.service.misc.jdk8`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk8)\n\n3.  **Guava on JDK 8** bundle ([`pl.tlinkowski.unij.bundle.guava_jdk8`](subprojects/bundles/pl.tlinkowski.unij.bundle.guava_jdk8)), made of:\n    -   [`pl.tlinkowski.unij.service.collect.guava`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.guava)\n    -   [`pl.tlinkowski.unij.service.misc.jdk8`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk8)\n\n4.  **Eclipse Collections on JDK 8** bundle ([`pl.tlinkowski.unij.bundle.eclipse_jdk8`](subprojects/bundles/pl.tlinkowski.unij.bundle.eclipse_jdk8)), made of:\n    -   [`pl.tlinkowski.unij.service.collect.eclipse`](subprojects/bindings/collect/pl.tlinkowski.unij.service.collect.eclipse)\n    -   [`pl.tlinkowski.unij.service.misc.jdk8`](subprojects/bindings/misc/pl.tlinkowski.unij.service.misc.jdk8)\n\n## Usage\n\nSee [Usage](docs/USAGE.md) document.\n\n## Extra Information\n\nSee [Extra Information](docs/EXTRA.md) document.\n\n## Questions \u0026 Answers\n\nSee [Q\u0026A](docs/Q-and-A.md) document.\n\n## Changelog\n\nSee [Changelog](CHANGELOG.md) document.\n\n## Requirements\n\nUsage: JDK 8+.\n\nBuilding: Gradle 5+, JDK 11+.\n\n## About the Author\n\nSee my webpage ([tlinkowski.pl](https://tlinkowski.pl/)) or\nfind me on Twitter ([@t_linkowski](https://twitter.com/t_linkowski)).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftlinkowski%2Funij","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftlinkowski%2Funij","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftlinkowski%2Funij/lists"}