{"id":22330439,"url":"https://github.com/javadev/underscore-java17","last_synced_at":"2025-07-03T02:36:01.584Z","repository":{"id":43048254,"uuid":"176230413","full_name":"javadev/underscore-java17","owner":"javadev","description":"java 17 port of Underscore.js","archived":false,"fork":false,"pushed_at":"2024-04-14T00:29:22.000Z","size":713,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-04-14T15:03:40.363Z","etag":null,"topics":["functional-programming","java","java-xmlbuilder","json","json-to-xml","json-to-xml-converter","json-to-xml-java","underscore","xml","xml-to-json","xml-to-json-java","xmlbuilder"],"latest_commit_sha":null,"homepage":"https://javadev.github.io/underscore-java/","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javadev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-03-18T07:49:05.000Z","updated_at":"2024-04-16T00:30:47.587Z","dependencies_parsed_at":"2023-02-19T02:45:24.477Z","dependency_job_id":"41444cb2-582e-4a1a-916a-a01fa2144b14","html_url":"https://github.com/javadev/underscore-java17","commit_stats":null,"previous_names":["javadev/underscore-java11"],"tags_count":64,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java17","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java17/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java17/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java17/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javadev","download_url":"https://codeload.github.com/javadev/underscore-java17/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228041304,"owners_count":17860221,"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":["functional-programming","java","java-xmlbuilder","json","json-to-xml","json-to-xml-converter","json-to-xml-java","underscore","xml","xml-to-json","xml-to-json-java","xmlbuilder"],"created_at":"2024-12-04T04:06:54.189Z","updated_at":"2025-07-03T02:36:01.545Z","avatar_url":"https://github.com/javadev.png","language":"Java","readme":"\u003cimg src=\"underscore-logo.png\" alt=\"drawing\" width=\"220\" align = \"right\"/\u003e\n\nunderscore-java17\n=================\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.github.javadev/underscore17.svg)](https://central.sonatype.com/artifact/com.github.javadev/underscore17/1.71)\n[![MIT License](http://img.shields.io/badge/license-MIT-green.svg) ](https://github.com/javadev/underscore-java17/blob/main/LICENSE)\n[![Java CI](https://github.com/javadev/underscore-java17/actions/workflows/maven.yml/badge.svg)](https://github.com/javadev/underscore-java17/actions/workflows/maven.yml)\n[![CodeQL](https://github.com/javadev/underscore-java17/actions/workflows/codeql.yml/badge.svg)](https://github.com/javadev/underscore-java17/actions/workflows/codeql.yml)\n[![Semgrep](https://github.com/javadev/underscore-java17/actions/workflows/semgrep.yml/badge.svg)](https://github.com/javadev/underscore-java17/actions/workflows/semgrep.yml)\n[![Scorecard supply-chain security](https://github.com/javadev/underscore-java17/actions/workflows/scorecard.yml/badge.svg?branch=main)](https://github.com/javadev/underscore-java17/actions/workflows/scorecard.yml)\n[![codecov](https://codecov.io/gh/javadev/underscore-java17/branch/main/graph/badge.svg?token=Sl3Bfpo62j)](https://codecov.io/gh/javadev/underscore-java17)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=javadev_underscore-java11\u0026metric=sqale_rating)](https://sonarcloud.io/summary/overall?id=javadev_underscore-java11)\n[![javadoc](https://javadoc.io/badge2/com.github.javadev/underscore17/javadoc.svg)](https://javadoc.io/doc/com.github.javadev/underscore17)\n[![Build Status](https://dev.azure.com/javadevazure/underscore-java/_apis/build/status/javadev.underscore-java17?branchName=main)](https://dev.azure.com/javadevazure/underscore-java/_build/latest?definitionId=6\u0026branchName=main)\n![Java Version](https://img.shields.io/badge/java-%3E%3D%2017-success)\n[![](https://img.shields.io/github/stars/javadev/underscore-java17?style=flat-square)](https://github.com/javadev/underscore-java17)\n[![](https://img.shields.io/github/forks/javadev/underscore-java17?style=flat-square)](https://github.com/javadev/underscore-java17/fork)\n\nRequirements\n============\n\nJava 17 and later, [Java 11](https://github.com/javadev/underscore-java) or [Kotlin](https://github.com/kotlindev/underscore-kotlin)\n\n## Installation\n\nTo configure your Maven project, add the following code to your pom.xml file:\n\n```xml\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.javadev\u003c/groupId\u003e\n    \u003cartifactId\u003eunderscore17\u003c/artifactId\u003e\n    \u003cversion\u003e1.71\u003c/version\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\nGradle configuration:\n\n```groovy\nimplementation 'com.github.javadev:underscore17:1.71'\n```\n\n### Usage\n\n```java\nU.of(/* array | list | set | map | anything based on Iterable interface */)\n    .filter(..)\n    .map(..)\n    ...\n    .sortWith()\n    .forEach(..);\nU.of(value1, value2, value3)...\nU.range(0, 10)...\n\nU.of(1, 2, 3) // or java.util.Arrays.asList(1, 2, 3) or new Integer[] {1, 2, 3}\n    .filter(v -\u003e v \u003e 1)\n    // 2, 3\n    .map(v -\u003e v + 1)\n    // 3, 4\n    .sortWith((a, b) -\u003e b.compareTo(a))\n    .forEach(System.out::println);\n    // 4, 3\n    \nU.of(1, 2, 3) // or java.util.Arrays.asList(1, 2, 3) or new Integer[] {1, 2, 3}\n    .mapMulti((num, consumer) -\u003e {\n        for (int i = 0; i \u003c num; i++) {\n            consumer.accept(\"a\" + num);\n        }\n    })\n    .forEach(System.out::println);\n    // \"a1\", \"a2\", \"a2\", \"a3\", \"a3\", \"a3\"\n\nU.formatXml(\"\u003ca\u003e\u003cb\u003edata\u003c/b\u003e\u003c/a\u003e\", Xml.XmlStringBuilder.Step.TWO_SPACES);\n    // \u003ca\u003e\n    //   \u003cb\u003edata\u003c/b\u003e\n    // \u003c/a\u003e\n\nU.formatJson(\"{\\\"a\\\":{\\\"b\\\":\\\"data\\\"}}\", Json.JsonStringBuilder.Step.TWO_SPACES);\n    // {\n    //   \"a\": {\n    //     \"b\": \"data\"\n    //   }\n    // }\n\nU.xmlToJson(\n    \"\u003cmydocument has=\\\"an attribute\\\"\u003e\\n\"\n        + \"   \u003cand\u003e\\n\"\n        + \"   \u003cmany\u003eelements\u003c/many\u003e\\n\"\n        + \"    \u003cmany\u003emore elements\u003c/many\u003e\\n\"\n        + \"   \u003c/and\u003e\\n\"\n        + \"   \u003cplus a=\\\"complex\\\"\u003e\\n\"\n        + \"     element as well\\n\"\n        + \"   \u003c/plus\u003e\\n\"\n        + \"\u003c/mydocument\u003e\",\n    Json.JsonStringBuilder.Step.TWO_SPACES);\n    // {\n    //   \"mydocument\": {\n    //     \"-has\": \"an attribute\",\n    //     \"and\": {\n    //       \"many\": [\n    //         \"elements\",\n    //         \"more elements\"\n    //       ]\n    //     },\n    //     \"plus\": {\n    //       \"-a\": \"complex\",\n    //       \"#text\": \"\\n     element as well\\n   \"\n    //     }\n    //   },\n    //   \"#omit-xml-declaration\": \"yes\"\n    // }\n\nU.xmlToJsonMinimum(\n    \"\u003cdata\u003e\\n\"\n        + \"    \u003cstring\u003eExample Text\u003c/string\u003e\\n\"\n        + \"    \u003cinteger\u003e42\u003c/integer\u003e\\n\"\n        + \"    \u003cfloat\u003e3.14\u003c/float\u003e\\n\"\n        + \"    \u003cboolean\u003etrue\u003c/boolean\u003e\\n\"\n        + \"    \u003cdate\u003e2025-02-26\u003c/date\u003e\\n\"\n        + \"    \u003ctime\u003e14:30:00\u003c/time\u003e\\n\"\n        + \"    \u003cdatetime\u003e2025-02-26T14:30:00Z\u003c/datetime\u003e\\n\"\n        + \"    \u003carray\u003eItem 1\u003c/array\u003e\\n\"\n        + \"    \u003carray\u003eItem 2\u003c/array\u003e\\n\"\n        + \"    \u003cobject\u003e\\n\"\n        + \"        \u003ckey1\u003eValue 1\u003c/key1\u003e\\n\"\n        + \"        \u003ckey2\u003eValue 2\u003c/key2\u003e\\n\"\n        + \"    \u003c/object\u003e\\n\"\n        + \"    \u003cnull/\u003e\\n\"\n        + \"\u003c/data\u003e\\n\",\n    Json.JsonStringBuilder.Step.TWO_SPACES);\n    // {\n    //   \"data\": {\n    //     \"string\": \"Example Text\",\n    //     \"integer\": \"42\",\n    //     \"float\": \"3.14\",\n    //     \"boolean\": \"true\",\n    //     \"date\": \"2025-02-26\",\n    //     \"time\": \"14:30:00\",\n    //     \"datetime\": \"2025-02-26T14:30:00Z\",\n    //     \"array\": [\n    //       \"Item 1\",\n    //       \"Item 2\"\n    //     ],\n    //     \"object\": {\n    //       \"key1\": \"Value 1\",\n    //       \"key2\": \"Value 2\"\n    //     },\n    //     \"null\": \"\"\n    //   }\n    // }\n\nU.jsonToXml(\n    \"{\\n\"\n        + \"  \\\"mydocument\\\": {\\n\"\n        + \"    \\\"-has\\\": \\\"an attribute\\\",\\n\"\n        + \"    \\\"and\\\": {\\n\"\n        + \"      \\\"many\\\": [\\n\"\n        + \"        \\\"elements\\\",\\n\"\n        + \"        \\\"more elements\\\"\\n\"\n        + \"      ]\\n\"\n        + \"    },\\n\"\n        + \"    \\\"plus\\\": {\\n\"\n        + \"      \\\"-a\\\": \\\"complex\\\",\\n\"\n        + \"      \\\"#text\\\": \\\"\\\\n     element as well\\\\n   \\\"\\n\"\n        + \"    }\\n\"\n        + \"  },\\n\"\n        + \"  \\\"#omit-xml-declaration\\\": \\\"yes\\\"\\n\"\n        + \"}\",\n    Xml.XmlStringBuilder.Step.TWO_SPACES);\n    // \u003cmydocument has=\"an attribute\"\u003e\n    //   \u003cand\u003e\n    //     \u003cmany\u003eelements\u003c/many\u003e\n    //     \u003cmany\u003emore elements\u003c/many\u003e\n    //   \u003c/and\u003e\n    //   \u003cplus a=\"complex\"\u003e\n    //      element as well\n    //    \u003c/plus\u003e\n    // \u003c/mydocument\u003e\n\nU.jsonToXmlMinimum(\n    \"{\\n\"\n        + \"  \\\"data\\\": {\\n\"\n        + \"    \\\"string\\\": \\\"Example Text\\\",\\n\"\n        + \"    \\\"integer\\\": \\\"42\\\",\\n\"\n        + \"    \\\"float\\\": \\\"3.14\\\",\\n\"\n        + \"    \\\"boolean\\\": \\\"true\\\",\\n\"\n        + \"    \\\"date\\\": \\\"2025-02-26\\\",\\n\"\n        + \"    \\\"time\\\": \\\"14:30:00\\\",\\n\"\n        + \"    \\\"datetime\\\": \\\"2025-02-26T14:30:00Z\\\",\\n\"\n        + \"    \\\"array\\\": [\\n\"\n        + \"      \\\"Item 1\\\",\\n\"\n        + \"      \\\"Item 2\\\"\\n\"\n        + \"    ],\\n\"\n        + \"    \\\"object\\\": {\\n\"\n        + \"      \\\"key1\\\": \\\"Value 1\\\",\\n\"\n        + \"      \\\"key2\\\": \\\"Value 2\\\"\\n\"\n        + \"    },\\n\"\n        + \"    \\\"null\\\": \\\"\\\"\\n\"\n        + \"  }\\n\"\n        + \"}\",\n    Xml.XmlStringBuilder.Step.TWO_SPACES);\n    // \u003cdata\u003e\n    //   \u003cstring\u003eExample Text\u003c/string\u003e\n    //   \u003cinteger\u003e42\u003c/integer\u003e\n    //   \u003cfloat\u003e3.14\u003c/float\u003e\n    //   \u003cboolean\u003etrue\u003c/boolean\u003e\n    //   \u003cdate\u003e2025-02-26\u003c/date\u003e\n    //   \u003ctime\u003e14:30:00\u003c/time\u003e\n    //   \u003cdatetime\u003e2025-02-26T14:30:00Z\u003c/datetime\u003e\n    //   \u003carray\u003eItem 1\u003c/array\u003e\n    //   \u003carray\u003eItem 2\u003c/array\u003e\n    //   \u003cobject\u003e\n    //     \u003ckey1\u003eValue 1\u003c/key1\u003e\n    //     \u003ckey2\u003eValue 2\u003c/key2\u003e\n    //   \u003c/object\u003e\n    //   \u003cnull string=\"true\"/\u003e\n    // \u003c/data\u003e\n\nU.Builder builder = U.objectBuilder()\n    .add(\"firstName\", \"John\")\n    .add(\"lastName\", \"Smith\")\n    .add(\"age\", 25)\n    .add(\"address\", U.arrayBuilder()\n        .add(U.objectBuilder()\n            .add(\"streetAddress\", \"21 2nd Street\")\n            .add(\"city\", \"New York\")\n            .addNull(\"cityId\")\n            .add(\"state\", \"NY\")\n            .add(\"postalCode\", \"10021\")))\n    .add(\"phoneNumber\", U.arrayBuilder()\n        .add(U.objectBuilder()\n            .add(\"type\", \"home\")\n            .add(\"number\", \"212 555-1234\"))\n        .add(U.objectBuilder()\n            .add(\"type\", \"fax\")\n            .add(\"number\", \"646 555-4567\")));\nSystem.out.println(builder.toJson());\nSystem.out.println(builder.toXml());\n```\n```javascript\n{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"age\": 25,\n  \"address\": [\n    {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"cityId\": null,\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    }\n  ],\n  \"phoneNumber\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"fax\",\n      \"number\": \"646 555-4567\"\n    }\n  ]\n}\n```\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003croot\u003e\n  \u003cfirstName\u003eJohn\u003c/firstName\u003e\n  \u003clastName\u003eSmith\u003c/lastName\u003e\n  \u003cage number=\"true\"\u003e25\u003c/age\u003e\n  \u003caddress array=\"true\"\u003e\n    \u003cstreetAddress\u003e21 2nd Street\u003c/streetAddress\u003e\n    \u003ccity\u003eNew York\u003c/city\u003e\n    \u003ccityId null=\"true\"/\u003e\n    \u003cstate\u003eNY\u003c/state\u003e\n    \u003cpostalCode\u003e10021\u003c/postalCode\u003e\n  \u003c/address\u003e\n  \u003cphoneNumber\u003e\n    \u003ctype\u003ehome\u003c/type\u003e\n    \u003cnumber\u003e212 555-1234\u003c/number\u003e\n  \u003c/phoneNumber\u003e\n  \u003cphoneNumber\u003e\n    \u003ctype\u003efax\u003c/type\u003e\n    \u003cnumber\u003e646 555-4567\u003c/number\u003e\n  \u003c/phoneNumber\u003e\n\u003c/root\u003e\n```\n\nSimplify XML document creation by structuring your code like the final document.\n\nThis code:\n\n```java\nXmlBuilder builder = XmlBuilder.create(\"Projects\")\n    .e(\"underscore-java\").a(\"language\", \"Java\").a(\"scm\", \"SVN\")\n        .e(\"Location\").a(\"type\", \"URL\")\n            .t(\"https://github.com/javadev/underscore-java/\")\n        .up()\n    .up()\n    .e(\"JetS3t\").a(\"language\", \"Java\").a(\"scm\", \"CVS\")\n        .e(\"Location\").a(\"type\", \"URL\")\n            .t(\"https://jets3t.s3.amazonaws.com/index.html\");\nSystem.out.println(builder.toXml(Xml.XmlStringBuilder.Step.TWO_SPACES));\nSystem.out.println(builder.toJson(Json.JsonStringBuilder.Step.TWO_SPACES));\n```\n\nGenerates the following XML and JSON documents:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cProjects\u003e\n    \u003cunderscore-java language=\"Java\" scm=\"SVN\"\u003e\n        \u003cLocation type=\"URL\"\u003ehttps://github.com/javadev/underscore-java/\u003c/Location\u003e\n    \u003c/underscore-java\u003e\n    \u003cJetS3t language=\"Java\" scm=\"CVS\"\u003e\n        \u003cLocation type=\"URL\"\u003ehttps://jets3t.s3.amazonaws.com/index.html\u003c/Location\u003e\n    \u003c/JetS3t\u003e\n\u003c/Projects\u003e\n```\n```json\n{\n  \"Projects\": {\n    \"underscore-java\": {\n      \"-language\": \"Java\",\n      \"-scm\": \"SVN\",\n      \"Location\": {\n        \"-type\": \"URL\",\n        \"#text\": \"https://github.com/javadev/underscore-java/\"\n      }\n    },\n    \"JetS3t\": {\n      \"-language\": \"Java\",\n      \"-scm\": \"CVS\",\n      \"Location\": {\n        \"-type\": \"URL\",\n        \"#text\": \"https://jets3t.s3.amazonaws.com/index.html\"\n      }\n    }\n  }\n}\n```\n\nUnderscore-java is a java port of [Underscore.js](https://underscorejs.org/).\n\nIn addition to porting Underscore's functionality, Underscore-java includes matching unit tests.\n\nFor docs, license, tests, and downloads, see:\nhttps://javadev.github.io/underscore-java\n\nThanks to Jeremy Ashkenas and all contributors to Underscore.js.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavadev%2Funderscore-java17","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavadev%2Funderscore-java17","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavadev%2Funderscore-java17/lists"}