If you are unfamiliar with Java 8 Streams then I suggest you first check out our Introduction to Streams before reading this article.
Java 8 Filters are an Intermediate Operation that can be performed on a Stream. Traditionally if you had a collection of data such as a List and you wanted to filter out some data, you would need to think either think about the repercussions of mutating the data or simply make a copy of the collection. With Java 8 Filters you are working with Streams so you never end up mutating the original data.
Let’s say you have a list of names and you want to Filter out any names that start with the letter A.
Given the following ArrayList of Strings
| 1 2 3 4 5 | List<String> strings = new ArrayList<String>(); strings.add("Alice"); strings.add("Arianna"); strings.add("Jennifer"); strings.add("Melissa"); | 
 You can use the filter operation
Filter
| 1 2 3 | strings.stream() .filter(e -> !e.startsWith("A")) .forEach(System.out::println); | 
 Which produces the following output to the console:
Console Output
| 1 2 | Jennifer Melissa | 
 Let’s say you want to also filter any names that start with M. You could either chain another filter Operation or you add the check to your existing filter. Let’s take a look at both.
Add to the existing Filter
| 1 2 3 | strings.stream() .filter(e -> !e.startsWith("A") && !e.startsWith("M")) .forEach(System.out::println); | 
 or 
Chain New Filter
| 1 2 3 4 | strings.stream() .filter(e -> !e.startsWith("A")) .filter(e -> !e.startsWith("M")) .forEach(System.out::println); | 
 Both Operations produce the same result:
Console Output
| 1 | Jennifer |