Ways to filter list in java
Tags: java, collections, filter, list
Published: 2023-04-23 17:32:08

List is commonly used Collection in Java. Many times List needs to be filtered by some attribute or property. Example: Filter the Employee list to get list of permanent employees only. There are many ways to filter list. This blog focus on filtering list with different criteria.

For filtering example we are considering list of Apples. List has mix of apples with red and green color with different weight and taste.

Lets create Apple class with color, weight and  taste with getter and setters implemented.

```
package com.filter.fruits;

public class Apple {
	private int weight;
	private String color;
	private String taste;
	
	
	public Apple() {
		super();
	}

	public Apple(int weight, String color, String taste) {
		super();
		this.weight = weight;
		this.color = color;
		this.taste = taste;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public String getTaste() {
		return taste;
	}

	public void setTaste(String taste) {
		this.taste = taste;
	}

	@Override
	public String toString() {
		return "Apple [weight=" + weight + ", color=" + color + ", taste=" + taste + "]";
	}

}

```
Lets create a utils class to get List of mixed  Apples.

```
package com.filter.fruits;

import java.util.ArrayList;
import java.util.List;
//This class create methods for getting pre-filled list of apples
public class AppleUtils {
	public static List<Apple> getAppleList() {
		List<Apple> applesList = new ArrayList<>();
		applesList.add(new Apple(100, "Green", "Sour"));
		applesList.add(new Apple(200, "Red", "Sweet"));
		applesList.add(new Apple(150, "Green", "Sour"));
		applesList.add(new Apple(250, "Red", "Sweet"));
		applesList.add(new Apple(150, "Green", "Sour"));
		applesList.add(new Apple(150, "Red", "Sweet"));
		applesList.add(new Apple(200, "Green", "Sour"));
		return applesList;
	}

}

```
Now, we need to create methods to filter out apples.
AppleFilterUtils  has methods as below.

- _filterByRedColor_ methods filters by "Red" color which is not flexible
- _filterByGreenColor_ methods filters by "Gree" color which is not flexible
- _filterByColor_ methods filters by color which is passed from outside. This method can be used for green as red apple filtering
- _filterByColorAndWeight_ methods filters by color and weight by passing them from outside
- _filterByCritera_ methods filters criteria passed using Predicate class. Predicate class define criteria.

```
package com.filter.fruits;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class AppleFilterUtils {
	public static List<Apple> filterByRedColor(List<Apple> appleList){
		List<Apple> filteredList = new ArrayList<>();
		for(Apple apple : appleList) {
			if("Red".equals(apple.getColor())) {
				filteredList.add(apple);
			}
		}
		return filteredList;
	}
	
	public static List<Apple> filterByGreenColor(List<Apple> appleList){
		List<Apple> filteredList = new ArrayList<>();
		for(Apple apple : appleList) {
			if("Green".equals(apple.getColor())) {
				filteredList.add(apple);
			}
		}
		return filteredList;
	}
	
	public static List<Apple> filterByColor(List<Apple> appleList, String color){
		List<Apple> filteredList = new ArrayList<>();
		for(Apple apple : appleList) {
			if(color.equals(apple.getColor())) {
				filteredList.add(apple);
			}
		}
		return filteredList;
	}
	
	public static List<Apple> filterByColorAndWeight(List<Apple> appleList, String color, int weight){
		List<Apple> filteredList = new ArrayList<>();
		for(Apple apple : appleList) {
			if(color.equals(apple.getColor()) && weight >= apple.getWeight()) {
				filteredList.add(apple);
			}
		}
		return filteredList;
	}
	
	
	public static List<Apple> filterByCritera(List<Apple> appleList, Predicate<Apple> predicate){
		List<Apple> filteredList = new ArrayList<>();
		for(Apple apple : appleList) {
			if(predicate.test(apple)) {
				filteredList.add(apple);
			}
		}
		return filteredList;
	}
	
}

```

Custom Predicates can be created by inheriting Predicate class.

Lets create Predicate for Green apples and another for filtering apples having weight more than 150g

```
package com.filter.fruits.predicates;

import java.util.function.Predicate;

import com.acts.fruits.Apple;

public class AppleColorPredicate implements Predicate<Apple>{

	
	@Override
	public boolean test(Apple t) {
		return "Green".equals(t.getColor());
	}

}

```

```
package com.filter.fruits.predicates;

import java.util.function.Predicate;

import com.acts.fruits.Apple;

public class AppleWeightPredicate implements Predicate<Apple>{

	@Override
	public boolean test(Apple t) {
		return t.getWeight() > 150;
	}

}

```


Lets take look at below Tester class to test Filter methods from AppleFilterUtils class

```
package com.acts.fruits.tester;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import com.filter.fruits.Apple;
import com.filter.fruits.AppleFilterUtils;
import com.filter.fruits.AppleUtils;
import com.filter.fruits.predicates.AppleColorPredicate;
import com.filter.fruits.predicates.AppleWeightPredicate;

public class AppleFilterTester {

	public static void main(String[] args) {
		//Getting apple list from utils class
		List<Apple> applesList = AppleUtils.getAppleList();
		System.out.println("1.All Apples\n" + applesList);

		//Filter By Red color
		List<Apple> filteredList1 = AppleFilterUtils.filterByRedColor(applesList);
		System.out.println("2.Red apples\n" + filteredList1);

		//Filter By Green color
		List<Apple> filteredList2 = AppleFilterUtils.filterByGreenColor(applesList);
		System.out.println("3.Green apples\n" + filteredList2);

		//Passing color as parameter
		//Filter By color: Red
		List<Apple> filteredList3 = AppleFilterUtils.filterByColor(applesList, "Red");
		System.out.println("4.Red apples\n" + filteredList3);

		//Filter By color: Green
		List<Apple> filteredList4 = AppleFilterUtils.filterByColor(applesList, "Green");
		System.out.println("5.Green apples\n" + filteredList4);

		//Filter By color: Green and weight >150
		List<Apple> filteredList5 = AppleFilterUtils.filterByColorAndWeight(applesList, "Green", 150);
		System.out.println("6.Green apples\n" + filteredList5);

		// Using predicate from java8
		Predicate<Apple> appleColorPredicate =  new AppleColorPredicate();
		//Filter By color: Green  using predicate
		List<Apple> filteredList6 = AppleFilterUtils.filterByCritera(applesList, appleColorPredicate);
		System.out.println("7.Green apples\n" + filteredList6);

		// Using predicate from java8
		Predicate<Apple> appleWeightPredicate =  new AppleWeightPredicate();
		//Filter By weight > =150  using predicate
		List<Apple> filteredList7 = AppleFilterUtils.filterByCritera(applesList, appleWeightPredicate);
		System.out.println("8.With Weight apples\n" + filteredList7);

		// Using predicate from java8
		Predicate<Apple> predicate = (apple) ->  apple.getColor().equals("Red") && apple.getWeight() > 200;
		List<Apple> filteredList8 = AppleFilterUtils.filterByCritera(applesList, predicate);
		System.out.println("9.Red With Weight apples\n" + filteredList8);

		// Using predicate and stream api from java8
		List<Apple> filteredList9 = applesList.stream()
		.filter(predicate)
		.collect(Collectors.toList());
		System.out.println("10.Red With Weight apples\n" + filteredList9);
		
		
		// Using Stream and predicate on the fly and stream api from java8
		List<Apple> filteredList10 = applesList.stream()
				.filter((apple) ->  apple.getColor().equals("Green") && apple.getWeight() > 150)
				.collect(Collectors.toList());
		System.out.println("11.Freen With Weight apples\n" + filteredList10);
		
		// Using Stream and predicate on the fly and stream api from java8
		List<Apple> filteredList11 = applesList.stream()
				.filter((apple) ->  apple.getColor().equals("Green"))
				.filter((apple) ->  apple.getTaste().equals("Sweet"))
				.collect(Collectors.toList());
		System.out.println("12.Green With Taste apples\n" + filteredList11);


	}

}

```