黑马程序员技术交流社区

标题: 【day12】-函数式编程 [打印本页]

作者: tianhaolin    时间: 2018-12-2 10:40
标题: 【day12】-函数式编程
本帖最后由 tianhaolin 于 2018-12-2 10:42 编辑

1.函数式接口
  1)函数式接口
   有且只有一个抽象方法的接口,称之为函数式接口
   接口中可以包含其他的方法(默认,静态,私有)
  2)@FunctionalInterface注解
   可使用@FunctionalInterface注解,检查接口是否为函数式接口
     是:编译成功
     否:编译失败

2.函数式编程
  1)Lambda的延迟执行
     *背景:有些场景的代码执行后,结果不一定被使用,从而造成性能浪费
           而Lambda表达式是延迟执行的,正好可以作为解决方案,提升性能         
     *Lambda的特点:延迟加载
           使用Lambda表达式作为参数传递,仅仅是把参数传递到方法中,只有满足条件,才会执行函数式接口中的方法
     *Lambda的使用前提:必须存在函数式接口
  2)使用Lambda作为参数和返回值
     
3.java.util.function.Supplier<T>函数式接口: 生产型函数式接口
     *抽象方法
          T get(): 用于获取一个对象或值.
          至于获取什么值, 怎么获取, 需要我们根据应用场景编写Lambda来实现
          指定生产接口的泛型是什么类型,接口方法get()就会生产什么类型的数据
        
4.java.util.function.Consumer<T>函数式接口: 消费型函数式接口
     *抽象方法
           void accept(T t): 用于消费(使用)一个对象或值.
          至于怎么消费, 需要我们根据应用场景编写Lambda来实现(输出..计算..等)
          接口指定什么类型,就使用什么类型的数据
     *默认方法:
           default Consumer<T> andThen(Consumer<? super T> after)
           如果要有两个消费接口实现类con1和con2
           con1.accept(s);
           con2.accept(s);
           等同于
           con1.andThen(con2).accept(s)  注:谁在前谁先消费
        
5.java.util.function.Predicate<T>函数式接口: 条件接口, 用于判断
     *抽象方法
           boolean test(T t): 判断参数传递的对象.
           至于怎么判断, 要判断什么, 需要我们编写Lambda表达式来实现
     *默认方法 (用于连接多个判断条件)
           default Predicate<T> and(Predicate<? super T> other): 与
           default Predicate<T> or(Predicate<? super T> other): 或
           default Predicate<T> negate(): 非, 取相反结果
6.java.util.function.Function<T,R>: 根据一个T类型的数据得到另一个R类型的数据
      T称为前置条件, 也就是输入(input)的类型
      R称为后置条件, 也就是返回结果(result)的类型
      有进有出, 所以称为"函数Function"
    *抽象方法
           R apply(T t): 将T转换为R
    *默认方法
           default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)
            拼接多个Function转换






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2