underscore-java alternatives and similar libraries
Based on the "Functional Programming" category.
Alternatively, view underscore-java alternatives based on common mentions on social networks and blogs.
-
Javaslang
vʌvr (formerly called Javaslang) is a non-commercial, non-profit object-functional library that runs with Java 8+. It aims to reduce the lines of code and increase code quality. -
Functional Java
Backport of Java 8's lambda expressions to Java 7, 6 and 5 -
jOOλ
jOOλ - The Missing Parts in Java 8 jOOλ improves the JDK libraries in areas where the Expert Group's focus was elsewhere. It adds tuple support, function support, and a lot of additional functionality around sequential Streams. The JDK 8's main efforts (default methods, lambdas, and the Stream API) were focused around maintaining backwards compatibility and implementing a functional API for parallelism. -
cyclops-react
An advanced, but easy to use, platform for writing functional applications in Java 8. -
derive4j
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, folds, optics and typeclasses. -
Faux Pas
A library that simplifies error handling for Functional Programming in Java -
Vavr
Functional component library that provides persistent data types and functional control structures.
WorkOS - The modern identity platform for B2B SaaS
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of underscore-java or a related project?
README
underscore-java
Requirements
Java 11 and later or Java 17.
Installation
Include the following in your pom.xml
for Maven:
<dependencies>
<dependency>
<groupId>com.github.javadev</groupId>
<artifactId>underscore</artifactId>
<version>1.84</version>
</dependency>
...
</dependencies>
Gradle:
implementation 'com.github.javadev:underscore:1.84'
Usage
U.of(/* array | list | set | map | anything based on Iterable interface */)
.filter(..)
.map(..)
...
.sortWith()
.forEach(..);
U.of(value1, value2, value3)...
U.range(0, 10)...
U.of(1, 2, 3) // or java.util.Arrays.asList(1, 2, 3) or new Integer[] {1, 2, 3}
.filter(v -> v > 1)
// 2, 3
.map(v -> v + 1)
// 3, 4
.sortWith((a, b) -> b.compareTo(a))
.forEach(System.out::println);
// 4, 3
U.of(1, 2, 3) // or java.util.Arrays.asList(1, 2, 3) or new Integer[] {1, 2, 3}
.mapMulti((num, consumer) -> {
for (int i = 0; i < num; i++) {
consumer.accept("a" + num);
}
})
.forEach(System.out::println);
// "a1", "a2", "a2", "a3", "a3", "a3"
U.formatXml("<a><b>data</b></a>");
// <a>
// <b>data</b>
// </a>
U.formatJson("{\"a\":{\"b\":\"data\"}}");
// {
// "a": {
// "b": "data"
// }
// }
U.xmlToJson("<a attr=\"c\"><b>data</b></a>");
// {
// "a": {
// "-attr": "c",
// "b": "data"
// },
// "#omit-xml-declaration": "yes"
// }
U.jsonToXml("{\"a\":{\"-attr\":\"c\",\"b\":\"data\"}}");
// <?xml version="1.0" encoding="UTF-8"?>
// <a attr="c">
// <b>data</b>
// </a>
U.Builder builder = U.objectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("age", 25)
.add("address", U.arrayBuilder()
.add(U.objectBuilder()
.add("streetAddress", "21 2nd Street")
.add("city", "New York")
.addNull("cityId")
.add("state", "NY")
.add("postalCode", "10021")))
.add("phoneNumber", U.arrayBuilder()
.add(U.objectBuilder()
.add("type", "home")
.add("number", "212 555-1234"))
.add(U.objectBuilder()
.add("type", "fax")
.add("number", "646 555-4567")));
System.out.println(builder.toJson());
System.out.println(builder.toXml());
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": [
{
"streetAddress": "21 2nd Street",
"city": "New York",
"cityId": null,
"state": "NY",
"postalCode": "10021"
}
],
"phoneNumber": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<firstName>John</firstName>
<lastName>Smith</lastName>
<age number="true">25</age>
<address array="true">
<streetAddress>21 2nd Street</streetAddress>
<city>New York</city>
<cityId null="true"/>
<state>NY</state>
<postalCode>10021</postalCode>
</address>
<phoneNumber>
<type>home</type>
<number>212 555-1234</number>
</phoneNumber>
<phoneNumber>
<type>fax</type>
<number>646 555-4567</number>
</phoneNumber>
</root>
String inventory =
"{\n"
+ " \"inventory\": {\n"
+ " \"#comment\": \"Test is test comment\",\n"
+ " \"book\": [\n"
+ " {\n"
+ " \"-year\": \"2000\",\n"
+ " \"title\": \"Snow Crash\",\n"
+ " \"author\": \"Neal Stephenson\",\n"
+ " \"publisher\": \"Spectra\",\n"
+ " \"isbn\": \"0553380958\",\n"
+ " \"price\": \"14.95\"\n"
+ " },\n"
+ " {\n"
+ " \"-year\": \"2005\",\n"
+ " \"title\": \"Burning Tower\",\n"
+ " \"author\": [\n"
+ " \"Larry Niven\",\n"
+ " \"Jerry Pournelle\"\n"
+ " ],\n"
+ " \"publisher\": \"Pocket\",\n"
+ " \"isbn\": \"0743416910\",\n"
+ " \"price\": \"5.99\"\n"
+ " },\n"
+ " {\n"
+ " \"-year\": \"1995\",\n"
+ " \"title\": \"Zodiac\",\n"
+ " \"author\": \"Neal Stephenson\",\n"
+ " \"publisher\": \"Spectra\",\n"
+ " \"isbn\": \"0553573862\",\n"
+ " \"price\": \"7.50\"\n"
+ " }\n"
+ " ]\n"
+ " }\n"
+ "}";
String title = U.selectToken(U.fromJsonMap(inventory), "//book[@year>2001]/title/text()");
// "Burning Tower"
String json =
"{\n"
+ " \"Stores\": [\n"
+ " \"Lambton Quay\",\n"
+ " \"Willis Street\"\n"
+ " ],\n"
+ " \"Manufacturers\": [\n"
+ " {\n"
+ " \"Name\": \"Acme Co\",\n"
+ " \"Products\": [\n"
+ " {\n"
+ " \"Name\": \"Anvil\",\n"
+ " \"Price\": 50\n"
+ " }\n"
+ " ]\n"
+ " },\n"
+ " {\n"
+ " \"Name\": \"Contoso\",\n"
+ " \"Products\": [\n"
+ " {\n"
+ " \"Name\": \"Elbow Grease\",\n"
+ " \"Price\": 99.95\n"
+ " },\n"
+ " {\n"
+ " \"Name\": \"Headlight Fluid\",\n"
+ " \"Price\": 4\n"
+ " }\n"
+ " ]\n"
+ " }\n"
+ " ]\n"
+ "}";
List<String> names = U.selectTokens(U.fromJsonMap(json), "//Products[Price>=50]/Name/text()");
// [Anvil, Elbow Grease]
Underscore-java is a java port of Underscore.js.
In addition to porting Underscore's functionality, Underscore-java includes matching unit tests.
For docs, license, tests, and downloads, see: https://javadev.github.io/underscore-java
Thanks to Jeremy Ashkenas and all contributors to Underscore.js.
*Note that all licence references and agreements mentioned in the underscore-java README section above
are relevant to that project's source code only.