Java 8 Stream API – distinct(), count() & sorted() Example
Hello. In this tutorial, we will explore the Stream API methods: sorted(), count(), and distinct() methods introduced in Java 8.
1. Introduction
Before diving deep into the practice stuff let us understand the methods we will be covering in this tutorial.
- The
distinct()
method returns a stream of unique elements. It is a stateful intermediate operation and returns a new stream. This method useshashCode()
andequals()
to get the unique elements - The
sorted()
method returns a stream consisting of elements in the sorted natural order. This method can also accept a comparator to provide customized sorting. It is a stateful intermediate operation and returns a new stream - The
count()
method returns the count of elements in a stream
2. Practice
Let us dive into some practice stuff from here and I am assuming that you already have the Java 1.8 or greater installed in your local machine. I am using JetBrains IntelliJ IDEA as my preferred IDE. You’re free to choose the IDE of your choice.
2.1 Model class
Create a java file in the com.java8.util
package and add the following code. The class will act as a model class for the creation of the employee list.
Employee.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.java8.util; import java.util.ArrayList; import java.util.List; public class Employee { private final String email; private final int age; private Employee(String email, int age) { this .email = email; this .age = age; } public static List<Employee> create() { List<Employee> employees = new ArrayList<>(); employees.add( new Employee( "john@email.com" , 21 )); employees.add( new Employee( "martin@email.com" , 19 )); employees.add( new Employee( "marry@email.com" , 31 )); employees.add( new Employee( "john@email.com" , 27 )); employees.add( new Employee( "marry@email.com" , 25 )); return employees; } public String getEmail() { return email; } public int getAge() { return age; } @Override public String toString() { return "Employee [email=" + email + ", age=" + age + "]" ; } } |
2.2 Understanding distinct() method
Create a java file in the com.java8
package and add the following code. The class will show the distinct()
method implementation in different ways.
DistinctDemo.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | package com.java8; import com.java8.util.Employee; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; public class DistinctDemo { // distinct() method returns a stream of unique elements // uses the hashCode() and equals() method to get the unique elements // removing duplicates from primitive type private static void method1() { List<Integer> duplicates = Arrays.asList( 1 , 2 , 2 , 3 , 4 , 5 , 6 , 6 , 1 , 8 , 0 , 10 ); print( "Original list: " , duplicates); List<Integer> unique = duplicates.stream() .distinct() .collect(Collectors.toList()); print( "Distinct list: " , unique); } // removing duplicates from object private static void method2() { List<Employee> employees = Employee.create(); print( "Original list: " , employees); List<Employee> distinct = employees.stream() .filter(distinctByKey(Employee::getEmail)) // using the predicate to remove the duplicated .collect(Collectors.toList()); print( "Distinct list: " , distinct); } // predicate to filter the duplicates by the given key extractor // does the job to remove the duplicates private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } // print the list private static void print(String message, List<?> some) { System.out.println(message + some); } // driver code public static void main(String[] args) { System.out.println( "-- Streams distinct() method --\n" ); method1(); System.out.println( "\n" ); method2(); } } |
Run the file as a java application and if everything goes well the following output will be logged in the IDE console.
Console output
1 2 3 4 5 6 7 8 | -- Streams distinct() method -- Original list: [1, 2, 2, 3, 4, 5, 6, 6, 1, 8, 0, 10] Distinct list: [1, 2, 3, 4, 5, 6, 8, 0, 10] Original list: [Employee [email=john@email.com, age=21], Employee [email=martin@email.com, age=19], Employee [email=marry@email.com, age=31], Employee [email=john@email.com, age=27], Employee [email=marry@email.com, age=25]] Distinct list: [Employee [email=john@email.com, age=21], Employee [email=martin@email.com, age=19], Employee [email=marry@email.com, age=31]] |
2.3 Understanding count() method
Create a java file in the com.java8
package and add the following code. The class will show the count()
method implementation in different ways.
CountDemo.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.java8; import com.java8.util.Employee; import java.util.Arrays; import java.util.List; public class CountDemo { // count() method counts the number of elements in the stream private static void method1() { List<Integer> list = Arrays.asList( 1 , 2 , 2 , 3 , 4 , 5 , 6 , 6 , 1 , 8 , 0 , 10 ); long total = list.stream() .count(); System.out.println( "Total elements = " + total); } private static void method2() { List<Employee> employees = Employee.create(); long total = employees.stream().count(); System.out.println( "Total employees = " + total); long freshers = employees.stream() .filter(employee -> employee.getAge() <= 21 ) .count(); System.out.println( "Total employees after filter(..) op = " + freshers); } // driver code public static void main(String[] args) { System.out.println( "-- Streams count() method --\n" ); method1(); System.out.println( "\n" ); method2(); } } |
Run the file as a java application and if everything goes well the following output will be logged in the IDE console.
Console output
1 2 3 4 5 6 7 | -- Streams count() method -- Total elements = 12 Total employees = 5 Total employees after filter(..) op = 2 |
2.4 Understanding sorted() method
Create a java file in the com.java8
package and add the following code. The class will show the sorted()
method implementation in different ways.
SortedDemo.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | package com.java8; import com.java8.util.Employee; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class SortedDemo { // sorted() method returns a stream consisting of elements in a sorted order // it is a stateful intermediate operation // sorting primitive type list private static void method1() { List<Integer> unsorted = Arrays.asList( 1 , 2 , 2 , 3 , 4 , 5 , 6 , 6 , 1 , 8 , 0 , 10 ); System.out.println( "Unsorted stream:" + unsorted); List<Integer> sorted = unsorted.stream() .sorted() .collect(Collectors.toList()); System.out.println( "Sorted stream:" + sorted); } // sorting object list private static void method2() { List<Employee> employees = Employee.create(); List<Employee> sorted = employees.stream() .sorted(Comparator.comparing(Employee::getAge)) // sorting the employees by age .collect(Collectors.toList()); System.out.println( "Sorted list : " + sorted); } // driver code public static void main(String[] args) { System.out.println( "-- Streams sorted() method --\n" ); method1(); System.out.println( "\n" ); method2(); } } |
Run the file as a java application and if everything goes well the following output will be logged in the IDE console.
Console output
1 2 3 4 5 6 7 | -- Streams sorted() method -- Unsorted stream:[1, 2, 2, 3, 4, 5, 6, 6, 1, 8, 0, 10] Sorted stream:[0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 8, 10] Sorted list : [Employee [email=martin@email.com, age=19], Employee [email=john@email.com, age=21], Employee [email=marry@email.com, age=25], Employee [email=john@email.com, age=27], Employee [email=marry@email.com, age=31]] |
That is all for this tutorial and I hope the article served you with whatever you were looking for. Happy Learning and do not forget to share!
4. Summary
In this tutorial, we learned the sorted()
, count()
, and distinct()
methods introduced in java8 programming along with the implementation. You can download the source code from the Downloads section.
5. Download the Project
This was a tutorial on learning and implementing the sorted()
, count()
, and distinct()
methods in Java 8.
You can download the full source code of this example here: Java 8 Stream API – distinct(), count() & sorted() Example