In this article, we’ll go through the Java Stream filter() method through detailed examples.
1. Java Stream Filter Method Overview
The stream.filter()
method is used to filter an object or a primitive based on the truthness of a boolean. The syntax of this method is the following:
Stream<Object_type_or_primitive> filter(Predicate<? super type_of_stream>)
The predicate could have one of the following syntaxes:
1.1 One-Line Lambda
a_variable -> a_boolean_value
1.2 Method Reference
Object_class_::a_method
This can replace the previous syntax in many cases and the result will be the same. The method a_method
must return a boolean.
1.3 Multiline Lambda
a_variable -> { lines_of_code; ... return a_boolean; }
The above will perform some operations before it returns a boolean. Note that this cannot be replaced by method reference without calling an external method.
2. Java Stream Filter Method Example With Lambda or Method Reference
Let’s say we have a list of article objects, the article record is the following:
private static record Article (int id, String title, String authorName){};
And we have a list of these articles:
Article forLoop = new Article( 1, "For Loop Java Tutorial", "Dimitris Tasios" ); Article interfaceTutorial = new Article( 2, "Java Interface Tutorial", "Georgios - Nikolaos Palaiologopoulos" ); Article generics = new Article( 3, "SQL LIKE Operator Tutorial", "Ignis Dei" ); Article mathRandom = new Article( 4, "Math.random Java Tutorial", "Georgios - Nikolaos Palaiologopoulos" ); Article swiftForLoop = new Article( 5, "Swift For Loop Tutorial", "Dimitris Tasios" );
Now let’s say we’d like to filter only the articles by author’s name.
private static List<Article> filterByAuthorName(List<Article> articles, String authorName){ return articles.stream() .filter(article -> article.authorName().equals(author)) .collect(Collectors.toList()); }
The above method takes a list of articles and an author’s name and returns a list that only contains the articles that have a specific author name. So, if we run the following:
filterByAuthorName(articles, "Georgios - Nikolaos Palaiologopoulos") .forEach(System.out::println);
It will output:
Article[id=2, title=Java Interface Tutorial, authorName=Georgios - Nikolaos Palaiologopoulos] Article[id=4, title=Math.random Java Tutorial, authorName=Georgios - Nikolaos Palaiologopoulos]
Here we should mention that we cannot replace the above predicate with a method reference since the predicate inside the filter should accept only one parameter (the article object) and should return a boolean. We could however create a method inside the record Article
like the one shown below:
private static boolean isIgnis(Article article){ return article.authorName().equals("Ignis Dei"); }
And then use it in the method below:
private List<Article> filterByAuthorIsIgnis(List<Article> articles){ return articles.stream() .filter(Article::isIgnis) .collect(Collectors.toList()); }
As a result, we would get only the articles written by “Ignis Dei”.
3. Java Stream Filter Method Example With Multiple Lines of Code
Furthermore, you can write multiple lines inside a lambda function in the filter method; for example, you might like to create two booleans and return true only if both are true. Of course, you could have written exactly the same with a simple inline lambda (article -> article.title().contains("Java") && article.authorName().equals("Dimitris Tasios"))
and the result would be the same (although it might be less readable than the snippet below).
private static List<Article> filterIfContainsJavaAndAuthorTasios(List<Article> articles){ return articles.stream() .filter(article -> { boolean containsJava = article.title().contains("Java"); boolean isTasios = article.authorName().equals("Dimitris Tasios"); return containsJava && isTasios; }) .collect(Collectors.toList()); }
As a result, if we run the following snippet:
filterByAuthorIsIgnis(articles) .forEach(System.out::println);
We will get the following output:
Article[id=1, title=For Loop Java Tutorial, authorName=Dimitris Tasios]
4. Conclusion
By now you should know how to use the stream.filter()
method of Java Stream API. You can find the source code on our GitHub page.