In this article, we will discuss different variation of pre-defined Predicate available for primitive data-types like int, long, double, etc. in Java 1.8 version
Predicate primitive Functional Interface :
- This is very similar to Predicate but it always accepts 1 input argument of type primitive-type like int, long and double, whereas Predicate allows to accept any data-type and return result in boolean value either true/false
- Performance-wise primitive Predicate is much faster compared to Predicate<T>
- There are lot of conversion happening for auto-boxing & auto-unboxing for converting primitive-type to wrapper-type and again wrapper-type to primitive-type and so on
- To avoid unnecessary conversion between primitive-type to wrapper-type and vice-versa, primitive-type specific Predicate Functional Interface for conversion introduced in Java 1.8 version as listed below,
- IntPredicate
- LongPredicate
- DoublePredicate
We will look into method signature along with example for each one of the above primitive Predicate Functional Interface
1. IntPredicate Functional Interface
- This primitive IntPredicate accepts 1-input argument of primitive-type int and it is not required to declare while defining IntPredicate (or lambda expression)
- Method signature : Below is the IntPredicate functional interface with single abstract test(); method along with other default and static methods
package java.util.function; import java.util.Objects; @FunctionalInterface public interface IntPredicate { /** * Evaluates this predicate on the given argument. * * @param value the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(int value); // other default and static methods }
1.1 Example for IntPredicate :
- Here, while defining lambda expression using IntPredicate we haven’t specified any data-type like Integer still compiler doesn’t complain and executed well
- Caution: but if we pass any other data-type like String or double then compile-time error will be thrown stating “The method test(int) in the type IntPredicate is not applicable for the arguments (double)“
package net.bench.resources.primitive.predicate.example; import java.util.function.IntPredicate; public class IntPredicateExample { public static void main(String[] args) { // lambda expression for IntPredicate to check number is even/odd IntPredicate ip = i -> i%2 == 0; // testing for different numbers using above lambda expression System.out.println("1. Whether 10 is even number : " + ip.test(10)); System.out.println("2. Whether 7 is even number : " + ip.test(7)); System.out.println("3. Whether 19 is even number : " + ip.test(19)); System.out.println("4. Whether 32 is even number : " + ip.test(32)); System.out.println("5. Whether 41 is even number : " + ip.test(41)); } }
Output:
1. Whether 10 is even number : true 2. Whether 7 is even number : false 3. Whether 19 is even number : false 4. Whether 32 is even number : true 5. Whether 41 is even number : false
2. LongPredicate Functional Interface
- This primitive LongPredicate accepts 1-input argument of primitive-type long and it is not required to declare while defining LongPredicate (or lambda expression)
- Method signature : Below is the LongPredicate functional interface with single abstract test(); method along with other default and static methods
package java.util.function; import java.util.Objects; @FunctionalInterface public interface LongPredicate { /** * Evaluates this predicate on the given argument. * * @param value the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(long value); // other default and static methods }
2.1 Example for LongPredicate :
- Here, while defining lambda expression using LongPredicate we haven’t specified any data-type like Long still compiler doesn’t complain and executed well
- Caution: but if we pass any other data-type like String or double then compile-time error will be thrown stating “The method test(long) in the type LongPredicate is not applicable for the arguments (double)“
package net.bench.resources.primitive.predicate.example; import java.util.function.LongPredicate; public class LongPredicateExample { public static void main(String[] args) { // lambda expression for LongPredicate to check number is positive or negative LongPredicate lp = longNum -> longNum >= 0; // testing for different numbers using above lambda expression System.out.println("1. Whether 10 is postive number : " + lp.test(10)); System.out.println("2. Whether -7 is postive number : " + lp.test(-7)); System.out.println("3. Whether 19 is postive number : " + lp.test(19)); System.out.println("4. Whether -32 is postive number : " + lp.test(-32)); System.out.println("5. Whether 41 is postive number : " + lp.test(41)); } }
Output:
1. Whether 10 is postive number : true 2. Whether -7 is postive number : false 3. Whether 19 is postive number : true 4. Whether -32 is postive number : false 5. Whether 41 is postive number : true
3. DoublePredicate Functional Interface
- This primitive DoublePredicate accepts 1-input argument of primitive-type double and it is not required to declare while defining DoublePredicate (or lambda expression)
- Method signature : Below is the DoublePredicate functional interface with single abstract test(); method along with other default and static methods
package java.util.function; import java.util.Objects; @FunctionalInterface public interface DoublePredicate { /** * Evaluates this predicate on the given argument. * * @param value the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(double value); // other default and static methods }
3.1 Example for DoublePredicate :
- Here, while defining lambda expression using DoublePredicate we haven’t specified any data-type like Double still compiler doesn’t complain and executed well
- Caution: but if we pass any other data-type like String then compile-time error will be thrown stating “The method test(double) in the type DoublePredicate is not applicable for the arguments (String)“
package net.bench.resources.primitive.predicate.example; import java.util.function.DoublePredicate; public class DoublePredicateExample { public static void main(String[] args) { // lambda expression for DoublePredicate to check CGPA is greater than 6.7 DoublePredicate dp = d -> d >= 6.7; // testing for different numbers using above lambda expression System.out.println("1. Whether Suresh passed with CGPA of 9.2 : " + dp.test(9.2)); System.out.println("2. Whether Naresh passed with CGPA of 4.3 : " + dp.test(4.3)); System.out.println("3. Whether Rajesh passed with CGPA of 7.9 : " + dp.test(7.9)); System.out.println("4. Whether Ramesh passed with CGPA of 5.4 : " + dp.test(5.4)); System.out.println("5. Whether Lokesh passed with CGPA of 6.8 : " + dp.test(6.8)); } }
Output:
1. Whether Suresh passed with CGPA of 9.2 : true 2. Whether Naresh passed with CGPA of 4.3 : false 3. Whether Rajesh passed with CGPA of 7.9 : true 4. Whether Ramesh passed with CGPA of 5.4 : false 5. Whether Lokesh passed with CGPA of 6.8 : true
References:
- https://docs.oracle.com/javase/8/docs/api/java/util/function/IntPredicate.html
- https://docs.oracle.com/javase/8/docs/api/java/util/function/LongPredicate.html
- https://docs.oracle.com/javase/8/docs/api/java/util/function/DoublePredicate.html
- https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
Happy Coding !!
Happy Learning !!