Java 8 Predicate 接口

简介

布尔值函数

观察其源码

image.png

要素察觉

  • 返回值是boolean
  • 有抽象方法test
  • 还有与或非(and、negate、or)的默认方法方法,暗示可以两个Predicate对象组合使用
  • 如果理解BiFunction,理解Predicate易如反掌

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
java复制代码public class PredicateTest {
public static void main(String[] args) {
PredicateTest test = new PredicateTest();
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
test.printByCondition(list,l -> l%2==0);//print 偶数
System.out.println("\n"+"-----------------");
test.printByConditionNegate(list,l -> l%2==0); //print 非偶数
System.out.println("\n"+"-----------------");
test.printByConditionAnd(list,l -> l%2==0,l -> l>4); //print 偶数且大于4的数
System.out.println("\n"+"-----------------");
test.printByConditionOr(list,l -> l%2==0,l -> l<4); //print 偶数或小于4 的数
}
public void printByCondition(List<Integer> list, Predicate<Integer> predicate){
//l表示list中的某一个元素 //某个元素满足某种条件就输出
list.forEach( l -> { if (predicate.test(l)) System.out.print(l+" "); });
}
public void printByConditionNegate(List<Integer> list, Predicate<Integer> predicate){
//l表示list中的某一个元素 //某元素不满足某种条件输出
list.forEach( l -> { if (predicate.negate().test(l)) System.out.print(l+" "); });
}
public void printByConditionAnd(List<Integer> list, Predicate<Integer> predicate1,Predicate<Integer> predicate2){
//某元素同时满足两个条件
list.forEach( l -> { if (predicate1.and(predicate2).test(l)) System.out.print(l+" "); });
}
public void printByConditionOr(List<Integer> list, Predicate<Integer> predicate1,Predicate<Integer> predicate2){
//某元素满足某一个条件
list.forEach( l -> { if (predicate1.or(predicate2).test(l)) System.out.print(l+" "); });
}
}

解释

image.png

image.png

image.png

image.png

  • 一定要时刻记住Lambda表达式含义,即实现接口中的一个抽象方法,最终还是要使用InterFaceClass.method
  • 参数和返回值一个都少不了

小结

Lambda表达式作用

  • 传递行为,而不仅仅是值

  • 提升抽象层次

    • 1
      2
      3
      4
      java复制代码public void printByCondition(List<Integer> list, Predicate<Integer> predicate){
      //l表示list中的某一个元素 //某个元素满足某种条件就输出
      list.forEach( l -> { if (predicate.test(l)) System.out.print(l+" "); });
      }
    • 单看这个方法只知道满足某个条件就输出,但具体是什么条件并不知道,所以说提升了抽象层次

  • API重用性更好

  • 更加灵活

    • 同一个方法,可以随意的用lambda表达式替换和现实,所以重用性和灵活性更高

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%