Predicate函数式接口的主要作用就是提供一个test方法,接受一个参数返回一个布尔类型, 在stream API中进行一些判断的时常用。
代码语言:javascript复制/**
表示一个参数的谓词(布尔值函数)。
这是一个功能接口,其 功能 方法是 test(Object)。
*/
@FunctionalInterface
public interface Predicate<T> {
// 根据给定参数计算此谓词
boolean test(T t);
/**
and方法接收一个Predicate类型,也就是将传入的条件和当前条件以并且的关系过滤数据
*/
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
/**
negate就是将当前条件取反。
*/
default Predicate<T> negate() {
return (t) -> !test(t);
}
/**
or方法同样接收一个Predicate类型,将传入的条件和当前的条件以或者的关系过滤数据
*/
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
/**
返回一个谓词,该谓词根据 测试 Objects.equals(Object, Object)两个参数是否相等。
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
使用泛型T指定传入的参数类型。不同条件取出不同数据的示例:
代码语言:javascript复制public class PredicateTest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
PredicateTest predicateTest = new PredicateTest();
//输出大于5的数字
List<Integer> result = predicateTest.conditionFilter(list, integer -> integer > 5);
result.forEach(System.out::println);
System.out.println("-------");
//输出大于等于5的数字
result = predicateTest.conditionFilter(list, integer -> integer >= 5);
result.forEach(System.out::println);
System.out.println("-------");
//输出小于8的数字
result = predicateTest.conditionFilter(list, integer -> integer < 8);
result.forEach(System.out::println);
System.out.println("-------");
//输出所有数字
result = predicateTest.conditionFilter(list, integer -> true);
result.forEach(System.out::println);
System.out.println("-------");
}
//高度抽象的方法定义,复用性高
public List<Integer> conditionFilter(List<Integer> list, Predicate<Integer> predicate){
return list.stream().filter(predicate).collect(Collectors.toList());
}
}
定义conditionFilter方法,stream()会将当前list作为源创建一个Stream对象,collect(Collectors.toList())将最终结果封装在ArrayList,filter方法接收一个Predicate类型参数用于对目标集合进行过滤。
把要处理的数据和具体的逻辑通过参数传递给conditionFilter。
例子返回true的条件意味着打印出集合中所有元素。
具体使用
代码语言:javascript复制public List<Integer> conditionFilterNegate(List<Integer> list, Predicate<Integer> predicate){
return list.stream().filter(predicate.negate()).collect(Collectors.toList());
}
public List<Integer> conditionFilterAnd(List<Integer> list, Predicate<Integer> predicate,Predicate<Integer> predicate2){
return list.stream().filter(predicate.and(predicate2)).collect(Collectors.toList());
}
public List<Integer> conditionFilterOr(List<Integer> list, Predicate<Integer> predicate,Predicate<Integer> predicate2){
return list.stream().filter(predicate.or(predicate2)).collect(Collectors.toList());
}
//大于5并且是偶数
result = predicateTest.conditionFilterAnd(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0);
//大于5或者是偶数
result = predicateTest.conditionFilterOr(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0);
//条件取反
result = predicateTest.conditionFilterNegate(list,integer2 -> integer2 > 5);
isEqual得到的也是一个用来进行条件判断的函数式接口实例。而返回的这个函数式接口实例是通过传入的targetRef的equals方法进行判断的。
代码语言:javascript复制System.out.println(Predicate.isEqual("test").test("test"));//true
这里会用第一个"test"的equals方法判断与第二个"test"是否相等,结果true。