In Java 8, Predicate is a functional interface, which accepts an argument and returns a boolean. Usually, it used to apply in a filter for a collection of objects.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Further Reading
Java 8 BiPredicate Examples
1. Predicate in filter()
filter() accepts predicate as argument.
Java8Predicate.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Java8Predicate {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> collect = list.stream().filter(x -> x > 5).collect(Collectors.toList());
System.out.println(collect); // [6, 7, 8, 9, 10]
}
}
Output
[6, 7, 8, 9, 10]
Java8Predicate.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Java8Predicate {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> noGreaterThan5 = x -> x > 5;
List<Integer> collect = list.stream()
.filter(noGreaterThan5)
.collect(Collectors.toList());
System.out.println(collect); // [6, 7, 8, 9, 10]
}
}
Output
[6, 7, 8, 9, 10]
2. Predicate.and()
2.1 Multiple filters.
Java8Predicate2.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Java8Predicate2 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// multiple filters
List<Integer> collect = list.stream()
.filter(x -> x > 5 && x < 8).collect(Collectors.toList());
System.out.println(collect);
}
}
Output
[6, 7]
2.2 Replace with Predicate.and()
Java8Predicate2.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Java8Predicate2 {
public static void main(String[] args) {
Predicate<Integer> noGreaterThan5 = x -> x > 5;
Predicate<Integer> noLessThan8 = x -> x < 8;
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> collect = list.stream()
.filter(noGreaterThan5.and(noLessThan8))
.collect(Collectors.toList());
System.out.println(collect);
}
}
Output
[6, 7]
3. Predicate.or()
Java8Predicate3.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Java8Predicate3 {
public static void main(String[] args) {
Predicate<String> lengthIs3 = x -> x.length() == 3;
Predicate<String> startWithA = x -> x.startsWith("A");
List<String> list = Arrays.asList("A", "AA", "AAA", "B", "BB", "BBB");
List<String> collect = list.stream()
.filter(lengthIs3.or(startWithA))
.collect(Collectors.toList());
System.out.println(collect);
}
}
Output
[A, AA, AAA, BBB]
4. Predicate.negate()
Find all elements not start with ‘A’.
Java8Predicate4.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Java8Predicate4 {
public static void main(String[] args) {
Predicate<String> startWithA = x -> x.startsWith("A");
List<String> list = Arrays.asList("A", "AA", "AAA", "B", "BB", "BBB");
List<String> collect = list.stream()
.filter(startWithA.negate())
.collect(Collectors.toList());
System.out.println(collect);
}
}
Output
[B, BB, BBB]
5. Predicate.test() in function
Predicate in function.
Java8Predicate5.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Java8Predicate5 {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "AA", "AAA", "B", "BB", "BBB");
System.out.println(StringProcessor.filter(
list, x -> x.startsWith("A"))); // [A, AA, AAA]
System.out.println(StringProcessor.filter(
list, x -> x.startsWith("A") && x.length() == 3)); // [AAA]
}
}
class StringProcessor {
static List<String> filter(List<String> list, Predicate<String> predicate) {
return list.stream().filter(predicate::test).collect(Collectors.toList());
}
}
Output
[A, AA, AAA]
[AAA]
6. Predicate Chaining
We can chain predicates together.
Java8Predicate6.java
package com.favtuts.java8;
import java.util.function.Predicate;
public class Java8Predicate6 {
public static void main(String[] args) {
Predicate<String> startWithA = x -> x.startsWith("a");
// start with "a" or "f"
boolean result = startWithA.or(x -> x.startsWith("f")).test("favtuts");
System.out.println(result); // true
// !(start with "a" and length is 3)
boolean result2 = startWithA.and(x -> x.length() == 3).negate().test("abc");
System.out.println(result2); // false
}
}
Output
true
false
7. Predicate in Object
Hosting.java
package com.favtuts.java8;
public class Hosting {
private int Id;
private String name;
private String url;
public Hosting(int id, String name, String url) {
Id = id;
this.name = name;
this.url = url;
}
//... getters and setters, toString()
}
HostingRespository.java
package com.favtuts.java8;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class HostingRespository {
public static List<Hosting> filterHosting(List<Hosting> hosting,
Predicate<Hosting> predicate) {
return hosting.stream()
.filter(predicate)
.collect(Collectors.toList());
}
}
Java8Predicate7.java
package com.favtuts.java8;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Java8Predicate7 {
public static void main(String[] args) {
Hosting h1 = new Hosting(1, "amazon", "aws.amazon.com");
Hosting h2 = new Hosting(2, "linode", "linode.com");
Hosting h3 = new Hosting(3, "liquidweb", "liquidweb.com");
Hosting h4 = new Hosting(4, "google", "google.com");
List<Hosting> list = Arrays.asList(new Hosting[]{h1, h2, h3, h4});
List<Hosting> result = HostingRespository.filterHosting(list, x -> x.getName().startsWith("g"));
System.out.println("result : " + result); // google
List<Hosting> result2 = HostingRespository.filterHosting(list, isDeveloperFriendly());
System.out.println("result2 : " + result2); // linode
}
public static Predicate<Hosting> isDeveloperFriendly() {
return n -> n.getName().equals("linode");
}
}
Output
result : [Hosting{Id=4, name='google', url='google.com'}]
result2 : [Hosting{Id=2, name='linode', url='linode.com'}]
Done.
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-basic/java8