Java8新特性 - 函数式接口(Functional Interface)

参考资料:Java 8 新特性—函数式接口 - 死磕 Java

概念

        函数式接口是一个只有一个抽象方法的接口,最开始的时候也叫做 SAM 类型的接口(Single Abstract Method)。它具有两个特点:

  1. 只包含一个抽象方法:函数式接口只能有一个抽象方法,但可以包含多个默认方法或静态方法。
  2. 用@FunctionalInterface注解标记:该注解不强制,但通常会使用它来标记该接口为函数式接口。这样做可以让编译器检查接口是否符合函数式接口的定义,以避免不必要的错误。

        Java 引入函数式接口的主要目的是支持函数式编程范式,也就是 Lambda 表达式。在 Java 中,“一切皆对象”是不可违背的宗旨,所以 Lambda 表达式是对象,而不是函数,他们必须要依附于一类特别的对象类型:函数式接口。

        所以,从本质上来说 Lambda 表达式就是一个函数式接口的实例。这就是 Lambda 表达式和函数式接口的关系。简单理解就是只要一个对象是函数式接口的实例,那么该对象就可以用 Lambda 表达式来表示。

Java8之前的

其实在 Java 8 之前就已经有了大量的函数式接口,比如Runnable、Callable、Comparator等。

Consumer (消费型)

Consumer 代表这一个接受一个输入参数并且不返回任何结果的操作。它包含一个抽象方法 accept(T t),该方法接受一个参数 t,并对该参数执行某种操作。

由于 Consumer 接口中包含的抽象方法不返回结果,所以它通常用于对对象进行一些操作,如修改、输出、打印等。

Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("consumer test");

组合调用

Consumer 接口中还有一个默认方法 andThen(),该方法接受一个 Consumer 实例对象 after,它允许我们将两个 Consumer 对象组合在一起,形成一个新的 Consumer 对象。

Function (函数型)

Function 代表一个接受一个输入参数并且产生一个输出结果的函数。

它包含一个抽象方法 R apply(T t),该方法接受一个参数 t(类型为 T),并返回一个结果(类型为 R),我们可以理解为根据一个数据类型 T ,经过一系列的操作后得到类型 R。

Function 接口是非常通用的,应该是他们四个当中使用最为广泛的。

  • 用途一:函数转换

Function可以用于将一个类型的值转换为另一个类型的值。它可以用于各种转换操作,如类型转换、数据映射等。

  • 用途二:数据处理

Function 可用于对输入数据进行处理并生成输出结果。它可以用于执行各种操作,如过滤、计算、提取、格式化等。

组合调用

Function 也提供了一些默认方法用于函数的组合:

  1. andThen(Function after) 方法链式调用: 接受一个 Function 作为参数,并返回一个新的 Function,该新函数首先应用当前函数,然后将结果传递给参数函数。这种方法链的方式可以用于将多个函数组合在一起,以执行一系列操作。
  2. compose(Function before):与 andThen()相反,它首先应用参数函数,然后再应用当前函数,这种可能更加好理解些,常用于一些顺序执行。

identity(恒等函数)

        identity()的作用就是 获取一个直接返回入参的函数,等价于形如t -> t。一看感觉没啥用处,其实它在某些场景大有用处,例如:

  • 作为默认函数可以作为函数组合链中的起点或默认函数。
  • 保持一致性,在某些情况下,我们可能需要一个函数,但不需要对输入进行任何操作。使用 identity() 可以确保函数的签名(输入和输出类型)与其他函数一致。

Supplier (供给型)

Supplier 是一个代表生产(或供应)某种结果的接口,它不接受任何参数,但能够提供一个结果。它定义了一个 get() 的抽象方法,用于获取结果。

Supplier<LocalDate> supplier = () -> LocalDate.now();
LocalDate localDate = supplier.get();

Supplier 接口通常用于惰性求值,只有在需要结果的时候才会执行get()。这对于延迟计算和性能优化非常有用。它也是是一个泛型接口,它可以返回不同类型的结果。

Predicate (断言型)

它接受一个输入参数并返回一个布尔值,用于表示某个条件是否满足。抽象方法为 test(),通常用于对集合中的元素进行筛选、过滤或判断。

Predicate<String> predicate = str -> str.length() > 10;
boolean result = predicate.test("www.baidu.com");

组合调用

  1. and(Predicate other): 返回一个新的 Predicate,表示两个 Predicate的与操作。
  2. or(Predicate other): 返回一个新的 Predicate,表示两个 Predicate 的或操作。
  3. negate(): 表示当前 Predicate 的逻辑非操作。

其他拓展接口

除了上面四个常用的函数式接口外,java.util.function 包下面还定义了很多函数式接口:

接口

说明

BiConsumer<T,U>

表示接受两个不同类型的参数,但不返回任何结果的操作

BiFunction<T,U,R>

表示接受两个不同类型的参数,并返回一个其它类型的结果的操作

BinaryOperator

表示接受两个相同类型的参数,并返回一个同一类型的结果的操作

BiPredicate<T,U>

表示接受两个不同诶行的参数,且返回布尔类型的结果的操作

BooleanSupplier

不接受任何参数,且返回一个布尔类型的结果的操作

DoubleBinaryOperator

表示接受两个double类型的参数,并返回double类型结果的操作

DoubleConsumer

表示接受一个double类型的参数,但不返回任何结果的操作

DoubleFunction

表示接受一个double类型的参数,且返回一个R类型的结果的操作

DoublePredicate

表示一个接受两个double类型的参数,且返回一个布尔类型的结果的操作

DoubleSupplier

表示一个不接受任何参数,但返回布尔类型的结果的操作

DoubleToIntFunction

表示接受两个double类型的参数,但返回一个int类型的结果的操作

DoubleToLongFunction

表示接受两个double类型的参数,但返回一个long类型的结果的操作

DoubleUnaryOperator

表示接受一个double类型的参数,且返回一个double类型的结果的操作

IntBinaryOperator

表示一个接受两个int类型的参数,且返回一个int类型的结果的操作

IntConsumer

表示接受一个int类型的参数,但不返回任何结果的操作

IntFunction

表示接受一个int类型的参数,但返回一个R类型的结果的操作

IntPredicate

表示接受一个int类型的参数,但返回布尔类型的结果的操作

IntSupplier

表示不接受任何参数,但返回一个int类型的结果的操作

IntToDoubleFunction

表示接受一个int类型的参数,但返回一个double类型的结果的操作

IntToLongFunction

表示接受一个int类型的参数,但返回一个long类型的结果的操作

IntUnaryOperator

表示接受一个int类型的参数,且返回一个int类型的结果的操作

LongBinaryOperator

表示接受两个long类型的参数,且返回一个long类型的结果的操作

LongConsumer

表示不接受任何参数,但返回一个long类型的结果的操作

LongFunction

表示接受一个loing类型的参数,但返回一个R类型的结果的操作

LongPredicate

表示接受一个long类型的参数,但返回布尔类型的结果的操作

LongSupplier

表示不接受任何参数,但返回一个long类型的结果的操作

LongToDoubleFunction

表示接受一个long类型的参数,但返回一个double类型的结果的函数

LongToIntFunction

表示接受一个long类型的参数,但返回int类型的结果的函数

LongUnaryOperator

表示接受一个long类型的参数,并返回一个long类型的结果的操作

ObjDoubleConsumer

表示接受两个参数,一个为T类型的对象,另一个double类型,但不返回任何结果的操作

ObjIntConsumer

表示接受两个参数,一个为T类型的对象,另一个int类型,但不返回任何结果的操作

ObjLongConsumer

表示接受两个参数,一个为T类型的对象,另一个double类型,但不返回任何结果的操作

ToDoubleBiFunction<T,U>

表示接受两个不同类型的参数,但返回一个double类型的结果的操作

ToDoubleFunction

表示一个接受指定类型T的参数,并返回一个double类型的结果的操作

ToIntBiFunction<T,U>

表示接受两个不同类型的参数,但返回一个int类型的结果的操作

ToIntFunction

表示一个接受指定类型T的参数,并返回一个int类型的结果的操作

ToLongBiFunction<T,U>

表示接受两个不同类型的参数,但返回一个long类型的结果的操作

ToLongFunction

表示一个接受指定类型的参数,并返回一个long类型的结果的操作

UnaryOperator

表示接受一个参数,并返回一个与参数类型相同的结果的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值