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 }