What is Predicate Functional Interface in Java 8

Last updated on February 29th, 2024

In implementing Lambda Expression we need a Functional Interface that’s why a Predefined Function Interface is given by Java People from Java 8 onwards. This is available in the “java.util.function” package. A predefined Functional Interface is making Lambda Expression used in a common coding activity. Predicate Predefined  Functional Interface is used for conditional check and returns a  boolean result as an output.

Prototype:

interface Predicate<T>{
public boolean test(T t);

}

T – It is the type of input to the predicate.

Example:

import java.util.function.Predicate;

public class Test {

  public static void main(String[] args) {

    Predicate < Integer > p = i -> i % 2 == 0;

    System.out.println("Is No. Even: " + p.test(10));

    System.out.println("Is No. Even: " + p.test(15));

    System.out.println("Is No. Even: " + p.test(20));

    System.out.println("Is No. Even: " + p.test(5));

  }
}
  • In the above example, we can check if the input number is even or not by using Predicate.
  • See the lines of code are reduced than without implementation of Lambda expression.

Output:

Is No. Even: true
Is No. Even: false
Is No. Even: true
Is No. Even: false

Example: 

import java.util.function.Predicate;

public class Test {

  public static void main(String[] args) {

    String[] s = {
      "Ramesh",
      "Ravi",
      "Raju",
      "Raghav",
      "Dinesh"
    };

    Predicate < String > p = s1 -> s1.length() > 5;

    for (String name: s) {

      if (p.test(name)) {

        System.out.println(name);

      }
     }
   }
}
  • In the above example, we can check String length is greater than five by using Predicate.

Output:

Ramesh
Raghav
Dinesh

Example: 

package test;

import java.util.ArrayList;

import java.util.List;

import java.util.function.Predicate;

class Student {

  String name;

  int marks;

  public Student(String name, int marks) {

    this.name = name;

    this.marks = marks;

  }

}

public class Test {

  public static void main(String[] args) {

    List < Student > listStudnt = new ArrayList < Student > ();

    listStudnt.add(new Student("Raj", 70));

    listStudnt.add(new Student("Vineet", 60));

    listStudnt.add(new Student("Raghav", 40));

    listStudnt.add(new Student("Sham", 30));

    listStudnt.add(new Student("Dinesh", 50));

    Predicate < Student > p = stu -> stu.marks > 40;

    for (Student stdnt: listStudnt) {

      if (p.test(stdnt)) {

        System.out.println("Name: " + stdnt.name + " Marks: " + stdnt.marks);

      }
    }
  }
}
  • In the above example, we can use Predicate in our class.
  • We also achieve this task through an “ if ” conditional check. But in future we are required to check more conditions then we have to perform more time in the “ if ” conditional check that’s why it is better to use Predicate and save all conditions into Predicate.

Output:

Name: Raj Marks: 70
Name: Vineet Marks: 60
Name: Dinesh Marks: 50

If we want to check whether the number is even or not and also check whether the number is greater than 10. In this type of conditional checking by using a Predicate we need two Predicates like
p1—>checking for an even number
p2—>checking for numbers greater than 10
We achieve this from Predicate Joining like:
p1.and(p2).test(20)

Predicate Joining:

Multiple Predicates are combined to check complex conditional expressions. This is called Predicate Joining.

  • p1.and(p2)————Satisfies both conditions
  • p1.or(p2)—————Satisfies one condition or other
  • p1.negate()————–Opposite of p1

Example:

import java.util.function.Predicate;

public class Test {

public static void main(String[] args) {

int[] n = { 6, 8, 30, 25, 30, 45, 40, 50 };

Predicate<Integer> p1 = i -> i % 2 == 0;

Predicate<Integer> p2 = i -> i >=10;

System.out.println("The numbers are:");

for (int n1 : n) {

if (p1.and(p2).test(n1)) {

System.out.println(n1);
     }
  }
 }
}
  • In the above example, we can check whether the number is even and greater than or equal to 10  by using Predicate Joining.

Output:

The numbers are:
30
30
40
50

Example: 

import java.util.function.Predicate;

public class Test {

public static void main(String[] args) {

int[] n = {5,6, 8, 25, 30, 45, 40, 50 };

Predicate<Integer> p1 = i -> i % 2 == 0;

Predicate<Integer> p2 = i -> i >=10;

System.out.println("The numbers are:");

for (int n1 : n) {

if (p1.or(p2).test(n1)) {

System.out.println(n1);

}
}
}
}
  •  In the above example, we can check whether the number is even or greater than equal to 10  by using Predicate Joining.

Output:

The numbers are:
6
8
25
30
45
40
50

Example: 

import java.util.function.Predicate;

public class Test {

public static void main(String[] args) {

int[] n = {5,6, 8, 25, 30, 45, 40, 50 };

Predicate<Integer> p1 = i -> i % 2 == 0;

System.out.println("The numbers which are not even:");

for (int n1 : n) {

if (p1.negate().test(n1)) {

System.out.println(n1);

}
}
}
}
  • In the above example, we can check the number is not even by using Predicate Joining.

Output:

The numbers which are not even:
5
25
45

Conclusion:

This topic is explained What is Predicate? How to use Predicate? What is Predicate Joining? How to use Predicate Joining?

Leave a Comment