This post explains how we can combine two or more predicates using logical operations as mentioned below
1) and
2) or
3) negate
Below is an example
Person
package Function;
public class Person {
private String ssn;
private String fname;
private String lname;
private String description;
private int age;
public String getSsn() {
return ssn;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append(this.ssn).append(",");
sb.append(this.fname).append(",");
sb.append(this.lname).append(",");
sb.append(this.age).append(",");
sb.append(this.description);
sb.append("}");
return sb.toString();
}
}
First Name Predicate
package Function;
import java.util.function.Predicate;
public class FNamePredicate implements Predicate {
private String fName;
@Override
public boolean test(Person person) {
if(fName.equals(person.getFname())) {
return true;
}
return false;
}
public void setfName(String fName) {
this.fName = fName;
}
}
Last Name Predicate
package Function;
import java.util.function.Predicate;
public class LNamePredicate implements Predicate {
private String lName;
@Override
public boolean test(Person person) {
if(lName.equals(person.getLname())) {
return true;
}
return false;
}
public void setlName(String lName) {
this.lName = lName;
}
}
Main Class
package Function;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class PredicateDemo2 {
public static void main(String[] args) {
List list = new ArrayList(10);
for(int i = 0 ; i < 10; i++) {
Person person = new Person();
person.setSsn("ssn" + i);
person.setFname("fname" + i);
person.setLname("lname" + i);
person.setDescription("description" + i);
person.setAge(i);
list.add(person);
}
display("Input List", list);
System.out.println();
FNamePredicate fNamePredicate = new FNamePredicate();
fNamePredicate.setfName("fname5");
LNamePredicate lNamePredicate = new LNamePredicate();
lNamePredicate.setlName("lname5");
Predicate namePredicate = fNamePredicate.and(lNamePredicate);
List list1 = filter(namePredicate, list);
display("Name and query", list1);
System.out.println();
lNamePredicate.setlName("lname6");
namePredicate = fNamePredicate.or(lNamePredicate);
list1 = filter(namePredicate, list);
display("Name or query", list1);
System.out.println();
Predicate fNamePredicate1 = fNamePredicate.negate();
list1 = filter(fNamePredicate1, list);
display("Negate of First name query", list1);
}
public static List filter(Predicate predicate, List list) {
List filteredList = new ArrayList();
for(Person person : list) {
if(predicate.test(person)) {
filteredList.add(person);
}
}
return filteredList;
}
public static void display(String queryName, List list) {
System.out.println(queryName);
for(Person person : list) {
System.out.println(person);
}
}
}
Output
Input List
{ssn0,fname0,lname0,0,description0}
{ssn1,fname1,lname1,1,description1}
{ssn2,fname2,lname2,2,description2}
{ssn3,fname3,lname3,3,description3}
{ssn4,fname4,lname4,4,description4}
{ssn5,fname5,lname5,5,description5}
{ssn6,fname6,lname6,6,description6}
{ssn7,fname7,lname7,7,description7}
{ssn8,fname8,lname8,8,description8}
{ssn9,fname9,lname9,9,description9}
Name and query
{ssn5,fname5,lname5,5,description5}
Name or query
{ssn5,fname5,lname5,5,description5}
{ssn6,fname6,lname6,6,description6}
Negate of First name query
{ssn0,fname0,lname0,0,description0}
{ssn1,fname1,lname1,1,description1}
{ssn2,fname2,lname2,2,description2}
{ssn3,fname3,lname3,3,description3}
{ssn4,fname4,lname4,4,description4}
{ssn6,fname6,lname6,6,description6}
{ssn7,fname7,lname7,7,description7}
{ssn8,fname8,lname8,8,description8}
{ssn9,fname9,lname9,9,description9}