Predicate函数式接口的主要作用就是提供一个test方法,接受一个参数返回一个布尔类型,
在stream API中进行一些判断的时常用。
/** 表示一个参数的谓词(布尔值函数)。 这是一个功能接口,其 功能 方法是 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指定传入的参数类型。不同条件取出不同数据的示例:
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的条件意味着打印出集合中所有元素。
具体使用
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方法进行判断的。
System.out.println(Predicate.isEqual("test").test("test"));//true
这里会用第一个"test"的equals方法判断与第二个"test"是否相等,结果true。