Java 8 Functional Interface – BiPredicate Example
Hello. In this tutorial, we will explain the BiPredicate functional interface in Java 8.
1. Introduction
Java 8 BiPredicate functional interface represents a method that accepts two input arguments and returns a boolean output. Represented by the method syntax – boolean test(T t, U u)
. This interface also provides some default methods like –
default BiPredicate or(BiPredicate other)
– Composed predicate that represents the Logical OR operation of one predicate and the otherdefault BiPredicate and(BiPredicate other)
– Composed predicate that represents the Logical AND operation of one predicate and the otherdefault BiPredicate negate()
– Returns a predicate that represents the logical negation of the given predicate
2. Practice
Let us dive into some practice stuff from here and I am assuming that you already have the Java 1.8 or greater installed in your local machine. I am using JetBrains IntelliJ IDEA as my preferred IDE. You’re free to choose the IDE of your choice.
2.1 Model class
Create a java file in the com.jcg.model
package and add the following code. The class will act as a model class for the creation of the student list.
Student.java
package com.jcg.model; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Student { private static final int BOUND = 100; private static final Random RANDOM = new Random(); private final int id; private final String name; private final String department; private Student(int id, String name, String department) { this.id = id; this.name = name; this.department = department; } public static List<Student> create() { List<Student> students = new ArrayList<>(); students.add(new Student(RANDOM.nextInt(BOUND), "adam", "medical")); students.add(new Student(RANDOM.nextInt(BOUND), "eve", "commerce")); students.add(new Student(RANDOM.nextInt(BOUND), "john", "non-medical")); students.add(new Student(RANDOM.nextInt(BOUND), "asha", "medical")); return students; } public int getId() { return id; } public String getName() { return name; } public String getDepartment() { return department; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", department='" + department + '\'' + '}'; } }
2.2 Understanding the BiPredicate
Create a java file in the com.jcg
package and add the following code. The class will show the BiPredicate functional interface implementation in different ways.
AppMain.java
package com.jcg; import com.jcg.model.Student; import java.util.List; import java.util.function.BiPredicate; /* Java8 functional interface - BiPredicate represents a boolean valued function of two arguments and returns a boolean value method syntax - <code>boolean test(T t, U u);</code> */ public class AppMain { // method #1 public static void method1() { BiPredicate<String, Integer> filterByLength = (str1, length) -> str1.length() >= length; boolean isEqual = filterByLength.test("adam", 5); System.out.println(isEqual); boolean isEqual1 = filterByLength.test("geek", 4); System.out.println(isEqual1); } // method #2 public static void method2() { List<Student> students = Student.create(); BiPredicate<Student, String> filterByDepartment = (student, department) -> student.getDepartment().equals(department); for (Student student : students) { boolean result = filterByDepartment.test(student, "medical"); if (result) System.out.println(student); } } // method #3 // returns a composed predicate that represents the logical AND of one predicate and another // method syntax - <code>default BiPredicate and(BiPredicate other)</code> // similarly we can also have a composed predicate that represents the logical OR public static void method3() { List<Student> students = Student.create(); BiPredicate<Student, String> namePrefixFilter = (student, prefix) -> student.getName().startsWith(prefix); BiPredicate<Student, String> nameSuffixFilter = (student, suffix) -> student.getName().endsWith(suffix); for (Student student : students) { boolean result = namePrefixFilter.and(nameSuffixFilter).test(student, "a"); if (result) System.out.println(student); } } // method #4 // returns a predicate that represents logical negation of the given predicate // method syntax - <code>default BiPredicate negate()</code> public static void method4() { BiPredicate<String, Integer> filterByLength = (string, length) -> string.length() >= length; // string length should not greater than or equal to 5 System.out.println(filterByLength.negate().test("geeks", 5)); } public static void main(String[] args) { System.out.println("-- BiPredicate functional interface implementation --\n"); method1(); System.out.println("\n"); method2(); System.out.println("\n"); method3(); System.out.println("\n"); method4(); } }
3. Code Run
Run the main file as a java application and if everything goes well the following output will be logged in the IDE console. You’re free to comment/uncomment the method for a better understanding of the BiPredicate functional interface.
Console output
-- BiPredicate functional interface implementation -- false true Student{id=92, name='adam', department='medical'} Student{id=24, name='asha', department='medical'} Student{id=92, name='asha', department='medical'} false
That is all for this tutorial and I hope the article served you with whatever you were looking for. Happy Learning and do not forget to share!
4. Summary
In this tutorial, we learned the BiPredicate functional interface introduced in java8 programming along with the implementation. The interface is responsible to produce a boolean result after the evaluation of two input arguments. You can download the source code from the Downloads section.
5. Download the Project
This was a tutorial on learning and implementing the BiPredicate functional interface in java8 programming.
You can download the full source code of this example here: Java 8 Functional Interface – BiPredicate Example