什么是函数式编程? `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"));
  }