Java 8 Streams filter examples
java 8
streams
filter
findAny
orElse
In this tutorial will present the use of streams: filter()
, collect()
, findAny()
and orElse()
.
filter() and collect()
Classic
Before Java 8 in order to filter a list, you had to loop through all the elements and put the results into a new list.
package com.admfactory.filter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ClassicFilterExample {
public static void main(String[] args) {
System.out.println("Classic Filter Example");
System.out.println();
List<String> list = Arrays.asList("Argon", "Xenon", "Krypton", "Neon", "Radon", "Helium");
System.out.println("List before filter: ");
System.out.println(list);
System.out.println();
List<String> result = getFilterOut(list, "Neon");
System.out.println("List after filter: ");
System.out.println(result);
}
/**
* Method to filter out the filter parameter
*
* @param lines
* the {@link List} object
* @param filter
* the element to be removed
* @return a new list of {@link List} object
*/
private static List<String> getFilterOut(List<String> lines, String filter) {
List<String> result = new ArrayList<>();
for (String line : lines) {
/** filter out the element */
if (!filter.equals(line)) {
result.add(line);
}
}
return result;
}
}
Output
Classic Filter Example
List before filter:
[Argon, Xenon, Krypton, Neon, Radon, Helium]
List after filter:
[Argon, Xenon, Krypton, Radon, Helium]
Java 8
Using Java 8 the code will be much simpler and at first, the look might look much complicated.
package com.admfactory.filter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Java8FilterExample {
public static void main(String[] args) {
System.out.println("Java 8 Filter Example");
System.out.println();
List<String> list = Arrays.asList("Argon", "Xenon", "Krypton", "Neon", "Radon", "Helium");
System.out.println("List before filter: ");
System.out.println(list);
System.out.println();
List<String> result = list.stream() // convert list to stream
.filter(line -> !"Neon".equals(line)) // remove the "Neon" element from the list
.collect(Collectors.toList()); // collect the output and convert stream back to a List
System.out.println("List after filter: ");
System.out.println(result);
}
}
Output
Java 8 Filter Example
List before filter:
[Argon, Xenon, Krypton, Neon, Radon, Helium]
List after filter:
[Argon, Xenon, Krypton, Radon, Helium]
filter(), findAny() and orElse()
For this will need a simple model class.
package com.admfactory.filter;
public class User {
private String user;
private String password;
private String email;
private User(String user, String password, String email) {
this.user = user;
this.password = password;
this.email = email;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Classic
Before Java 8 in order to find an object in a list, you had to loop through all the elements and compare the results.
package com.admfactory.filter;
import java.util.Arrays;
import java.util.List;
public class ClassicFindExample {
public static void main(String[] args) {
System.out.println("Classic Find Example");
System.out.println();
List<User> list = Arrays.asList(
new User("John", "pass1", "john@mail.com"),
new User("Emily", "pass2", "emily@mail.com"),
new User("Peter", "pass3", "peter@mail.com"));
System.out.println("Entire list: ");
System.out.println(list);
System.out.println();
User result = find(list, "Emily");
System.out.println("Find user: Emily");
System.out.println(result);
}
/**
* Method to find {@ User} object based on a property
*
* @param lines
* the {@link List} object
* @param filter
* the element to be removed
* @return a new list of {@link List} object
*/
private static User find(List<User> users, String name) {
for (User user : users) {
if (name.equals(user.getName())) {
return user;
}
}
return null;
}
}
Output
Classic Find Example
Entire list:
[[name: John, password: pass1, email: john@mail.com], [name: Emily, password: pass2, email: emily@mail.com], [name: Peter, password: pass3, email: peter@mail.com]]
Find user: Emily
[name: Emily, password: pass2, email: emily@mail.com]
Java 8
Using Java 8 the code will look like this.
package com.admfactory.filter;
import java.util.Arrays;
import java.util.List;
public class Java8FindExample {
public static void main(String[] args) {
System.out.println("Java 8 Find Example");
System.out.println();
List<User> list = Arrays.asList(
new User("John", "pass1", "john@mail.com"),
new User("Emily", "pass2", "emily@mail.com"),
new User("Peter", "pass3", "peter@mail.com"));
System.out.println("Entire list: ");
System.out.println(list);
System.out.println();
User user1 = list.stream() // Convert to steam
.filter(x -> "Emily".equals(x.getName())) // find user "Emily" only
.findAny() // If 'findAny' then return the found user
.orElse(null); // If not found, return null
System.out.println("User Emily");
System.out.println(user1);
System.out.println();
User user2 = list.stream().filter(x -> "Simon".equals(x.getName())).findAny().orElse(null);
System.out.println(user2);
System.out.println("User Simon");
System.out.println(user2);
}
}
Output
Java 8 Find Example
Entire list:
[[name: John, password: pass1, email: john@mail.com], [name: Emily, password: pass2, email: emily@mail.com], [name: Peter, password: pass3, email: peter@mail.com]]
User Emily
[name: Emily, password: pass2, email: emily@mail.com]
null
User Simon
null