Java 8 Stream interface introduces filter()
method which can be used to filter out elements based on a particular condition.
The condition to filter elements is specified as a predicate. If the condition evaluates to true, the object is selected. Otherwise, it will be ignored.
For example, you can use filter()
to get even elements from an ArrayList
.
The signature of the method is
Stream<T> filter(Predicate<? super T> predicate)
This method returns a stream consisting of the elements that matches the given predicate.
Since Predicate
is a functional interface, you can pass a lambda expression as well to the filter()
.
The filter()
method is an intermediate operation of the Stream
interface and is lazy in nature, i.e. filter()
produces another Stream and will not be evaluated until you call a terminal operation.
Now, we’ll see some examples of using filter()
method.
Filter a Stream using Lambda Expression
In this example, we are filtering a list of Integers to find out even numbers and printing in Console.
import java.util.Arrays; import java.util.List; public class FilterExample { public static void main(String[] args) { //List to find even integers List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //creating stream from list and filter list.stream() .filter(n -> n % 2 == 0) .forEach(System.out::println); } }
Output
2
4
6
8
10
Filter a Stream using Predicate
In this Java Example, we are printing only even numbers from a stream. We are creating a Predicate
to check if the number is even or not. Then, we are passing this Predicate
to filter()
method.
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class FilterExample { public static void main(String[] args) { //List to find even integers List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //Predicate to check if number is even Predicate<Integer> predicateForEven = new Predicate<Integer>() { @Override public boolean test(Integer n) { if (n % 2 == 0) { return true; } return false; } }; list.stream().filter(predicateForEven).forEach(System.out::println); } }
Output
2
4
6
8
10
Filtering a Stream and collecting result into a List
This Java example is same as the above examples, except we’ll collect the result into a list rather than printing in console. We can use the collect(Collectors.toList())
method to collect the stream of filtered elements into a List.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FilterExample { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenNumbers = list.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); } }
Output
[2, 4, 6, 8, 10]
filter() with map() example
map()
returns a stream consisting of the results of applying the given function to the elements of this stream. In this Java example, we’ll first get even numbers from a List and then will find square of numbers and will collect in a list.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FilterWithMapExample { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenWithSquare = list.stream() .filter(n -> n % 2 == 0) .map(n -> n * n) .collect(Collectors.toList()); System.out.println(evenWithSquare); } }
Output
[4, 16, 36, 64, 100]