什么是函数式编程? `Prodicate`
-
是基于函数式接口并使用lambda表达的编程方式。
-
函数式编程理念是将代码作为可重用数据带入到程序运行中。
-
函数式编程强调”你想做什么“而不是”你想怎么做“。
-
JDK8后提供了一系列新的函数式接口,位于java.util.function

案例,针对不同的判断条件进行输出,Predicate是一个函数式接口,其中的方法为boolean test(T i)对输入的一个数据进行判断:
@Test
void testPredicate() {
Predicate<Integer> predicate = n-> n>4;
boolean test = predicate.test(10);
System.out.println("test = " + test);//test = true
}
举例:
取出下列数据的中的奇数或偶数
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
经典java代码的判断方式,,-->问题是一段代码只能判断是奇数或偶数中的一个,想得出两一个结果就需要重新调整代码
for (Integer num : integers) {
if (num % 2 == 1) {
System.out.println(num);
}
}
使用Prodicate函数式接口,并Lambda表达式作为参数,灵活获取想要的结果集
private List<Integer> filter(List<Integer> integers, Predicate<Integer> even) {
return integers.stream().filter(even).collect(Collectors.toList());
}
@Test
void testFilter() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Predicate<Integer> odd = n -> n % 2 == 1;
//
Predicate<Integer> even = n -> n % 2 == 0;
System.out.println(filter(integers, even)); // 获取或有奇数;
// [2, 4, 6, 8]
System.out.println(filter(integers, odd)); // 获取所有偶数;
// [1, 3, 5, 7, 9]
System.out.println(filter(integers, n -> n > 5 && n % 2 == 0)); // 获取数列中大于5的奇数
// [6, 8]
}
我想你应该体会到函数式编程的厉害之处了,函数式编程它并不是将某个具体的数值带入到我们程序中,而是将我们已有的代码作为可重用的资源放入到我们程序中来运行,这样就给我们程序提供了极大的灵活性,现在你是可以只对奇数偶数来进行判断,如果我让你判断数字是否为质数的时候,是不是只需要调整even这些代码就可以了。函数式编程的核心理念就是依托于这些函数式接口,将这些程序的代码作为判断的条件,运行时动态的带入我们程序,这样便可以让我们程序变得更加的灵活。同时因为在Java中提供的lambda特性,所以我们在实现具体的函数式接口的时候,是非常简单的事情。
练习
使用Predicate函数式接口作为参数,完成查找字符串集合中包含字符 ‘a‘ 的元素

public static void strFilter(List<String> list,Predicate<String> predicate) {
for (String s : list) {
if (predicate.test( s)) {
System.out.println("s = " + s);
}
}
}
@Test
void testStrFilter() {
List<String> strings = Arrays.asList("java", "python", "php", "HTML");
strFilter(strings, s ->s.contains("a"));
}