{"id":22513436,"url":"https://github.com/emahtab/java-8-streams","last_synced_at":"2026-03-19T23:02:58.766Z","repository":{"id":262660791,"uuid":"887960250","full_name":"eMahtab/java-8-streams","owner":"eMahtab","description":"Java 8 Streams","archived":false,"fork":false,"pushed_at":"2025-03-02T05:37:01.000Z","size":30,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-02T06:20:41.707Z","etag":null,"topics":["java-8-streams"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eMahtab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-13T15:19:45.000Z","updated_at":"2025-03-02T05:37:04.000Z","dependencies_parsed_at":"2024-11-13T16:28:17.376Z","dependency_job_id":"7299667c-f526-41be-b052-d52d4b7fede5","html_url":"https://github.com/eMahtab/java-8-streams","commit_stats":null,"previous_names":["emahtab/java-8-streams"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eMahtab%2Fjava-8-streams","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eMahtab%2Fjava-8-streams/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eMahtab%2Fjava-8-streams/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eMahtab%2Fjava-8-streams/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eMahtab","download_url":"https://codeload.github.com/eMahtab/java-8-streams/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245950635,"owners_count":20699102,"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":["java-8-streams"],"created_at":"2024-12-07T03:12:20.826Z","updated_at":"2026-01-08T04:02:35.964Z","avatar_url":"https://github.com/eMahtab.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Java 8 Streams\n\n## Creating stream from primitive type (int, long, double)\n\nJava 8 comes with IntStream, LongStream, DoubleStream to work with stream of primitive types.\n\n```java\nimport java.util.stream.IntStream;\n\npublic class Main {\n\n    public static void main(String[] args) {\n        int[] arr = {1,3,6,2,5,4,5};\n        System.out.println(IntStream.of(arr).sum()); // 25\n        System.out.println(IntStream.of(arr).average().getAsDouble()); // 3.7142857142857144\n        System.out.println(IntStream.of(arr).min().getAsInt()); // 1\n        System.out.println(IntStream.of(arr).max().getAsInt()); // 6\n        IntStream.of(arr).sorted().forEach(num -\u003e System.out.print(num+\", \")); // 1, 2, 3, 4, 5, 5, 6, \n    }\n}\n```\n\n## Stream interface mapToInt(), mapToLong() and mapToDouble() function which returns IntStream, LongStream, DoubleStream  \n\n```java\nIntStream mapToInt(ToIntFunction\u003c? super T\u003e mapper)\n\nLongStream mapToLong(ToLongFunction\u003c? super T\u003e mapper)\n\nDoubleStream mapToDouble(ToDoubleFunction\u003c? super T\u003e mapper)\n```\n\n## Arrays.stream()\n```\npublic static IntStream stream(int[] array)\n\npublic static LongStream stream(long[] array)\n\npublic static DoubleStream stream(double[] array)\n```\n\n## Converting stream of primitives to stream of wrapper types\n\nBy calling boxed() method on a primitve stream can be converted to stream of wrapper types.\n```\nIntStream's -\u003e Stream\u003cInteger\u003e boxed()\n\nLongStream's -\u003e Stream\u003cLong\u003e boxed()\n\nDoubleStream's -\u003e Stream\u003cDouble\u003e boxed()\n```\n\n### Sum stream elements\n```java\nimport java.util.Arrays;\nimport java.util.stream.IntStream;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\tint[] nums = {0,1,2,3,4,5,0,1,2,3,4,5};\n\t\tint sum1 = IntStream.of(nums).sum(); // Or IntStream.of(0,1,2,3,4,5,0,1,2,3,4,5).sum();\n\t\tint sum2 = Arrays.stream(nums).sum();\n\t\tSystem.out.println(sum1 + \",\" + (sum1==sum2));  // 30,true\n\t}\n}\n```\n### range() and rangeClosed()\n```java\npublic class App {\n    public static void main(String[] args) {\n       System.out.println(\"Sum :\"+IntStream.range(1, 5).sum());  // Sum :10\n       System.out.println(\"Sum :\"+IntStream.rangeClosed(1, 5).sum());  // Sum :15\n    }\n}\n```\n### Removing duplicates\n```java\nimport java.util.stream.IntStream;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\tint[] nums = {0,1,2,3,4,5,0,1,2,3,4,5};\n\t\tIntStream.of(nums)\n\t\t         .distinct()\n\t\t         .forEach((num) -\u003e System.out.print(num+\", \")); // 0, 1, 2, 3, 4, 5,\n\t}\n}\n```\n\n### Filter elements\n```java\nimport java.util.stream.IntStream;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\tint[] nums = {0,1,2,3,4,5,0,1,2,3,4,5};\n\t\tIntStream.of(nums)\n\t\t         .distinct()\n\t\t         .filter((num) -\u003e num % 2 == 0)\n\t\t         .forEach((num) -\u003e System.out.print(num+\", \")); // 0, 2, 4, \n\t}\n}\n```\n\n## Java 8 streams can't be reused  \nAfter the terminal operation is performed, the stream pipeline is consumed and can't be used anymore.\n  \n```java\nimport java.util.stream.*;\n\npublic class Main{\n  public static void main(String[] args) {\n    int[] digits = {0, 1, 2, 3, 4 , 5, 6, 7, 8, 9};\n    IntStream s = IntStream.of(digits);\n    long n = s.count();\n    System.out.println(s.findFirst()); // An exception will be thrown\n  }\n}\n  \n```  \n## Output :\n```\nException in thread \"main\" java.lang.IllegalStateException: stream has already been operated upon or closed\n    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)\n    at java.base/java.util.stream.IntPipeline.findFirst(IntPipeline.java:528)\n    at Main.main(Main.java:8)  \n  \n```\n\n```java\nimport java.util.stream.*;\n\npublic class Main{\n  public static void main(String[] args) {\n    int[] digits = {20, 1, 2, 3, 4 , 5, 6, 7, 8, 9};\n    long n = IntStream.of(digits).count();\n    System.out.println(\"Count : \" + n);\n    System.out.println(IntStream.of(digits).findFirst().getAsInt());\n  }\n} \n```  \n\n## Output :\n```\nCount : 10\n20  \n```\n\n### Using map() and collecting the proccessed list\n```java\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\tList\u003cString\u003e words = Arrays.asList(\"Java\", \"8\", \"Streams\");\n\t\tList\u003cInteger\u003e wordLengths = \n\t\t    words.stream()\n\t\t         .map(str -\u003e str.length())\n\t\t         .collect(Collectors.toList());\n\t\tSystem.out.println(wordLengths); // [4,1,7]\n\t}\n}\n```\n\n### Passing Comparator :  \n```java\nimport java.util.*;\nimport java.util.stream.*;\n\npublic class Main{\n  public static void main(String[] args) {\n    List\u003cString\u003e strings = Arrays.asList(\"Stream\",\"Operations\",\"on\",\"Collections\");\n    strings.stream().min(Comparator.comparing(\n                        (String s) -\u003e s.length())\n    ).ifPresent(System.out::println); // on\n  }\n}\n  \n``` \n\n### Stream of Objects \n```java\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\tList\u003cInteger\u003e numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);\n\t\tList\u003cInteger\u003e twoEvenSquares = \n\t\t    numbers.stream()\n\t\t           .filter(n -\u003e {\n\t\t                    System.out.println(\"filtering \" + n); \n\t\t                    return n % 2 == 0;\n\t\t                  })\n\t\t           .map(n -\u003e {\n\t\t                    System.out.println(\"mapping \" + n);\n\t\t                    return n * n;\n\t\t                  })\n\t\t           .limit(2)\n\t\t           .collect(Collectors.toList());\n\t\tSystem.out.println(\"Output :\"+twoEvenSquares);\n\t}\n}\n```\n### Output\n```\nfiltering 1\nfiltering 2\nmapping 2\nfiltering 3\nfiltering 4\nmapping 4\nOutput :[4, 16]\n```\n\n## Using flatMap() to flatten a stream of nested collection objects e.g. List\u003cList\u003cInteger\u003e\u003e listOfLists\n```java\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\t // List of lists of integers\n        List\u003cList\u003cInteger\u003e\u003e listOfLists = Arrays.asList(\n            Arrays.asList(1, 2, 3),\n            Arrays.asList(4, 5, 6),\n            Arrays.asList(7, 8, 9)\n        );\n\n        // Using flatMap to flatten the list of lists into a single list\n        List\u003cInteger\u003e flattenedList = \n        \t\tlistOfLists.stream()\n                           .flatMap(list -\u003e list.stream()) // Flatten the inner lists\n                           .collect(Collectors.toList());\n\n        // Print the flattened list\n        System.out.println(flattenedList); //[1, 2, 3, 4, 5, 6, 7, 8, 9]\n\t}\n}\n```\n\n```java\nimport java.util.List;\nimport java.util.Arrays;\n\npublic class Main {\n\n    public static void main(String[] args) {\n        List\u003cList\u003cInteger\u003e\u003e listOfLists = List.of(List.of(1, 2, 3), List.of(4, 5, 6));\n\n        listOfLists.stream()\n                .flatMap(list -\u003e list.stream())\n                .forEach(System.out::println);\n\n        List\u003cInteger[]\u003e listOfArrays = List.of(new Integer[] { 1, 2, 3 }, new Integer[] { 4, 5, 6 });\n        listOfArrays.stream()\n                .flatMap(array -\u003e Arrays.stream(array))\n                .forEach(System.out::println);\n\n    }\n}\n```\n\n## Using flatMap() to flatten a stream of arrays e.g. List\u003cInteger[]\u003e listOfArrays\n\n```java\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\npublic class Test {\n\tpublic static void main(String[] args) {\n\t\t \n        List\u003cInteger[]\u003e listOfArrays = Arrays.asList(\n            new Integer[] {3, 2, 1},\n            new Integer[] {6, 5, 4},\n            new Integer[] {9, 8, 7}\n        );\n\n        // Using flatMap to flatten the list of arrays into a single list\n        List\u003cInteger\u003e flattenedList = \n        \t\tlistOfArrays.stream()\n                           .flatMap(array -\u003e Stream.of(array)) // Flatten the array\n                           .collect(Collectors.toList());\n\n        // Print the flattened list\n        System.out.println(flattenedList); //[3, 2, 1, 6, 5, 4, 9, 8, 7]\n\t}\n}\n```\n\n## Using flatMap() to create stream of single(atomic) elements e.g. number, string etc.\n```java\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\npublic class App {\n\tpublic static void main(String[] args) {\n\t\tList\u003cString\u003e sentences = Arrays.asList(\"Hello World\", \"Java Streams\", \"flatMap Example\");\n\t\tList\u003cString\u003e words = sentences.stream()\n\t\t                              .flatMap(sentence -\u003e Arrays.stream(sentence.split(\" \")))\n\t\t                              .collect(Collectors.toList());\n\n\t\tSystem.out.println(words); // [Hello, World, Java, Streams, flatMap, Example]\n\t}\n}\n```\n\n## Using toMap() Collector to create a Map after processing the stream\n```java\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nclass Employee {\n    private int id;\n    private String name;\n    private String department;\n    public Employee(int id, String name, String department) {\n        this.id = id;\n        this.name = name;\n        this.department = department;\n    }\n    public int getId() {\n        return id;\n    }\n    public String getName() {\n        return name;\n    }\n    public String getDepartment() {\n        return department;\n    }\n    @Override\n    public String toString() {\n        return \"{id=\" + id + \", name='\" + name + \"', department='\" + department + \"'}\";\n    }\n}\n\npublic class App {\n    public static void main(String[] args) {\n        List\u003cEmployee\u003e employees = Arrays.asList(\n            new Employee(101, \"Alice\", \"HR\"),\n            new Employee(102, \"Bob\", \"Finance\"),\n            new Employee(103, \"Charlie\", \"IT\"),\n            new Employee(104, \"David\", \"HR\")\n        );\n\n        // Convert the list to a map with employee ID as key and employee name as value\n        Map\u003cInteger, String\u003e employeeMap = employees.stream()\n            .collect(Collectors.toMap((emp) -\u003e emp.getId(), (emp) -\u003e emp.getName()));\n\n        System.out.println(\"Employee Map: \" + employeeMap);\n        // Employee Map: {101=Alice, 102=Bob, 103=Charlie, 104=David}\n\n        // Another use case: Creating a map with employee ID as key and the whole Employee object as value\n        Map\u003cInteger, Employee\u003e employeeDetailMap = employees.stream()\n            .collect(Collectors.toMap((emp) -\u003e emp.getId(), (emp) -\u003e emp));\n\n        System.out.println(\"Employee Detail Map: \" + employeeDetailMap);\n        // Employee Detail Map: {101={id=101, name='Alice', department='HR'}, 102={id=102, name='Bob', department='Finance'}, 103={id=103, name='Charlie', department='IT'}, 104={id=104, name='David', department='HR'}}\n    }\n}\n\n```\n\n## Sorting the stream elements with custom comparator\n```java\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class Test {\n\tpublic static void main(String[] args) {\n        List\u003cString\u003e words = Arrays.asList(\"banana\", \"cherry\", \"apple\", \"dates\");\n        List\u003cString\u003e sorted = words.stream()\n        \t\t                   .sorted((s1, s2) -\u003e s2.compareTo(s1))\n        \t\t                   .toList();\n        System.out.println(sorted); // [dates, cherry, banana, apple]\n\t}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femahtab%2Fjava-8-streams","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femahtab%2Fjava-8-streams","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femahtab%2Fjava-8-streams/lists"}