Java8函数式接口Predicate实战
关于函数式接口
函数式接口 Funcational Interface 是指接口范围内只允许有一个抽象方法(不包括default和static方法)的接口。Java中有一些预定义的函数接口,如Predicate、consumer、supplier等。Lambda函数的返回类型(在JDK1.8中引入)也是一个函数接口。
- 关于java接口抽象方法、default和static方法的使用,请看另一篇文章:
https://blog.csdn.net/IndexMan/article/details/128105852
关于Predicat接口
Predicat接口位于 java.util.function包下,它提高了代码的可管理性,有助于单独进行单元测试。尤其在我们对集合数据进行条件过滤时非常有用,它包含了
test
抽象方法,和and
、or
、 negative
、isEqual
4个方法。
编码实战
public class PredicateDemo {
public static List<String> STUDENTS = Arrays.asList(
"Lucy","Tomas Kyte","James Bond","Yamlis","Jack Luis"
);
public static void testPredicateAnd(){
Predicate<String> letterLengthLimit = s -> s.length() > 5;
Predicate<String> letterStartWith = s -> s.startsWith("J");
// 打印长度大于5并且以J开头的学生名字
STUDENTS.stream().filter(
letterLengthLimit.and(letterStartWith)
).forEach(System.out::println);
}
public static void testPredicateOr(){
Predicate<String> letterLengthLimit = s -> s.length() > 5;
Predicate<String> letterStartWith = s -> s.startsWith("J");
// 打印长度大于5并且或者以J开头的学生名字
STUDENTS.stream().filter(
letterLengthLimit.or(letterStartWith)
).forEach(System.out::println);
}
public static void testPredicateNegative(){
Predicate<String> letterLengthLimit = s -> s.length() > 5;
Predicate<String> letterStartWith = s -> s.startsWith("J");
// 打印长度大于5并且不是以J开头的学生名字
STUDENTS.stream().filter(
letterLengthLimit.and(letterStartWith.negate())
).forEach(System.out::println);
}
public static void testPredicateIsEqual(){
Predicate<String> letterEqualPredicate = s -> Predicate.isEqual("Lucy").test(s);
STUDENTS.stream().filter(
letterEqualPredicate
).forEach(System.out::println);
}
public static void main(String[] args) {
// 创建谓词函数
Predicate<Integer> pr = a -> (a>18);
// 利用谓词函数对参数做判断,满足谓词条件返回true否则false
System.out.println(pr.test(19));
System.out.println(">>>>测试and:");
testPredicateAnd();
System.out.println(">>>>测试or:");
testPredicateOr();
System.out.println(">>>>测试negative:");
testPredicateNegative();
System.out.println(">>>>测试isEqual:");
testPredicateIsEqual();
}
}
- 输出:
true
>>>>测试and:
James Bond
Jack Luis
>>>>测试or:
Tomas Kyte
James Bond
Yamlis
Jack Luis
>>>>测试negative:
Tomas Kyte
Yamlis
>>>>测试isEqual:
Lucy