天天看点

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

文章目录

  • 一、函数式接口
    • 1、函数式接口的定义
    • 2、`@FunctionalIntrrface`注解
    • 3、函数式接口的使用
  • 二、函数式编程
    • 1、Lambda的延迟执行
      • ①性能浪费的“日志案例”
      • ②使用Lambda优化“日志案例”
    • 2、用Lambda作为方法的参数、返回值
  • 三、常用的函数式接口
    • 1、Supplier接口
    • 2、Comsumer接口
      • Consumer接口中的抽象方法void accept(T t)
      • Consumer接口中的默认方法andThen
      • Consumer接口的练习
    • 3、Predicate接口
      • Predicate接口中的抽象方法boolean test(T t)
      • Predicate接口中默认方法——and方法
      • Predicate接口的默认方法——or方法
      • Predicate接口的默认方法——negate方法,表示取反
      • 练习:信息筛选
    • 4、Function接口
      • Function接口的抽象方法——R apply()
      • 默认方法——andThen方法

一、函数式接口

函数式接口: 有且只有一个抽象方法的接口,称之为函数式接口。(函数式接口中还可以包含其他非抽象方法,如默认、静态、私有)

Java中函数式接口的体现就是Lambda表达式,Lambda表达式可以当作匿名内部类的“语法糖”

1、函数式接口的定义

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

2、

@FunctionalIntrrface

注解

@FunctionalInterface 的作用:检测接口是不是函数式接口。

  • 如果是一个函数式接口,则编译成功
  • 如果接口中没有抽象方法或抽象方法的个数大于1个,则编译失败
Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

3、函数式接口的使用

函数式接口的使用:函数式接口可以作为方法的参数和返回值类型来使用

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口
Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

二、函数式编程

Java中的函数式编程,主要通过Lambda表达式和方法引用实现的。

1、Lambda的延迟执行

有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,这正好可以作为解决方案,提升性能。

①性能浪费的“日志案例”

具体场景见下面的“日志案例”。日志:可以记录程序运行中的情况,以便项目的监控和优化。

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

上面代码存在着性能浪费的问题:

  • 调用showLog方法, 传递的第二个参数是【拼接好之后的字符串】。
  • 该程序是,先把字符串拼接好, 然后调用showLog(),如果传递的日志等级不是1级,那么就不会用【已经拼接好的】字符串了,字符串就白拼接了,这就是性能的浪费。

②使用Lambda优化“日志案例”

Lambda的特点:存在延迟加载

使用Lambda的前提:必须存在函数式接口

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口
Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

上述代码说明:

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

2、用Lambda作为方法的参数、返回值

  • 使用Lambda表达式作为方法参数,其实就是使用函数式接口作为方法参数。(如果方法的参数是一个函数式接口类型,那么就可以使用匿名内部类或者Lambda进行替代)

例如:

java.lang.Runnable 接口

就是一个函数式接口,假设有一个

startThread 方法

使用该接口作为参数,那么就可以使用Lambda进行传参。这种情况其实和Thread 类的构造方法参数为Runnable 没有本质区别。

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口
  • 如果一个方法的返回值类型是一个函数式接口,那么也可以直接返回一个Lambda表达式。

例如:当需要通过一个方法来获取一个

java.util.Comparator 接口

类型的对象作为排序器时, 就可以调该方法获取。其中直接return一个Lambda表达式即可。

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

三、常用的函数式接口

JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在

java.util.function

包中被提供。

1、Supplier接口

java.util.function.Supplier<T> 接口

这个接口只有一个无参的方法: T get() ,作用:用来获取一个泛型参数指定类型的对象数据(就是如果指定泛型是字符串,那么该方法返回的就是字符串类型)

Supplier接口被称之为【生产型接口】(指定接口的泛型是什么类型, 那么接口中的get方法就会生产什么类型的数据)

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

2、Comsumer接口

java.util.function.Consumer<T>接口

正好与 Supplier接口 相反,是一个消费型接口。

Consumer接口中的抽象方法void accept(T t)

  • Consumer中包含抽象方法 void accept(T t),意为消费一个指定泛型的数据。
  • Consumer接口是一个消费型接口,泛型指定为什么类型,就可以使用accept方法消费什么类型的数据,具体怎么消费(使用),需要自定义(输出,计算…)
    Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

Consumer接口中的默认方法andThen

  • 作用:andThen方法,需要两个Comsumer接口,可以把两个Consumer接口组合到一起,再对数据进行消费

例如:(谁写andThen方法前面,谁先消费)

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

使用:

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

Consumer接口的练习

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

3、Predicate接口

java.util.function.Predicate<T>接口

作用:对某种数据类型的数据进行判断,结果返回一个boolean值

Predicate接口中的抽象方法boolean test(T t)

作用——用来对指定数据类型进行判断的方法,符合条件返回true,不符合条件返回false

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

Predicate接口中默认方法——and方法

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口
Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

Predicate接口的默认方法——or方法

作用跟and方法差不多,不过是 或运算

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口
Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

Predicate接口的默认方法——negate方法,表示取反

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

练习:信息筛选

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

4、Function接口

java.util.function.Function<T, R>接口

,作用:用来根据一个类型的数据得到另一个类型的数据,前者T称为前置条件,后者R称为后置条件

Function接口的抽象方法——R apply()

作用:根据类型T的参数获取类型R的结果

使用场景:如将String类型转换为Integer类型

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

默认方法——andThen方法

作用:用来进行组合操作

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

使用:

Javase-day21-函数式接口一、函数式接口二、函数式编程三、常用的函数式接口

继续阅读