Predicate篇
1 public class Person{ 2 private int age; 3 private String name; 4 public Person(int age, String name) { 5 this.age = age; 6 this.name = name; 7 } 8 public String getName() { 9 return name; 10 } 11 public void setName(String name) { 12 this.name = name; 13 } 14 public int getAge() { 15 return age; 16 } 17 public void setAge(int age) { 18 this.age = age; 19 } 20 @Override 21 public boolean equals(Object o) { 22 if (this == o) return true; 23 if (o == null || getClass() != o.getClass()) return false; 24 Person person = (Person) o; 25 if (age != person.age ||!name.equals(person.name)) return false; 26 return true; 27 } 28 @Override 29 public int hashCode() { 30 int result = age; 31 result = 31 * result + name.hashCode(); 32 return result; 33 } 34 }
1 public class UserStream { 2 3 public static void main(String[] args) { 4 5 // java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖 6 // Predicate接口主要用来判断一个参数是否符合要求,类似于Junit的assert. 7 8 /** 9 * 核心方法: 10 * boolean test(T t) 用来处理参数T,看起是否满足要求,可以理解为 条件A 11 * default Predicate<T> and(Predicate<? super T> other) 可理解为 条件A && 条件B 12 * default Predicate<T> negate() 对当前判断进行"!"操作,即取非操作,可理解为 ! 条件A 13 * default Predicate<T> or(Predicate<? super T> other) 对当前判断进行"||"操作,即取或操作,可以理解为 条件A ||条件B 14 * static <T> Predicate<T> isEqual(Object targetRef) 对当前操作进行"="操作,即取等操作,可以理解为 A == B 15 * 16 * 17 * 与Predicate<T>相关的接口 18 * BiPredicate<T, U> 针对两个参数,看两个参数是否符合某个条件表达式 19 * DoublePredicate 看一个double类型的值是否符合某个条件表达式 20 * IntPredicate 看一个int类型的值是否符合某个条件表达式 21 * LongPredicate 看一个long类型的值是否符合某个条件表达式 22 */ 23 24 // 测试1: 25 // test(T t):判断给定的值是否大于0 26 Predicate<Integer> predicate = x -> x > 0; 27 System.out.println(predicate.test(10)); // true 28 29 // 测试2: 30 // and(Predicate<? super T> other):判断给定的值是否是大于10的偶数 31 Predicate<Integer> predicate = x -> x > 10; 32 predicate = predicate.and(x -> x % 2 == 0); 33 System.out.println(predicate.test(15)); // false 34 System.out.println(predicate.test(18)); // true 35 System.out.println(predicate.test(20)); // true 36 37 // 测试3: 38 // negate():计算一批用户中年龄大于22岁的用户的数量 39 Predicate<Person> personPredicate = x -> x.getAge() > 22; 40 System.out.println( 41 Stream.of( 42 new Person(21, "zhangsan"), 43 new Person(22, "lisi"), 44 new Person(23, "wangwu"), 45 new Person(24, "wangwu"), 46 new Person(25, "lisi"), 47 new Person(26, "zhangsan") 48 ).filter(personPredicate.negate()).count() 49 ); 50 51 // 测试4: 52 // or(Predicate<? super T> other):计算一批用户中名称为"lisi"或者年龄大于25岁的用户的数量 53 Predicate<Person> predicate = x -> x.getName().equals("lisi"); 54 predicate = predicate.or(x -> x.getAge() > 25); 55 System.out.println( 56 Stream.of( 57 new Person(21, "zhangsan"), 58 new Person(22, "lisi"), 59 new Person(23, "wangwu"), 60 new Person(24, "wangwu"), 61 new Person(25, "lisi"), 62 new Person(26, "zhangsan") 63 ).filter(predicate).count() 64 ); 65 66 67 // 测试5:isEqual(Object targetRef) 68 // 假设认为两个用户如果年龄一样,名字一样,我们认为是一样的,那我们来找下给定的一批用户中一样的用户 69 Person person = new Person(22, "lisi"); 70 Predicate<Person> predicate = Predicate.isEqual(person); 71 System.out.println( 72 Stream.of( 73 new Person(21, "zhangsan"), 74 new Person(22, "lisi"), 75 new Person(23, "wangwu"), 76 new Person(24, "wangwu"), 77 new Person(22, "lisi"), 78 new Person(26, "zhangsan") 79 ).filter(predicate).count() 80 ); 81 } 82 }