概述

仅含有一个抽象方法 的接口称之为函数式接口,JDK中的函数式接口都加上 @FunctionalInterface 注解标识

Java 内置四大核心函数式接口

函数式接口 参数类型 返回类型 用途
Consumer 消费型接口 T void 对类型为 T 的对象应用操作,包含方法: void accept(T t)
Supplier 供给型接口 T 返回类型为 T 的对象,包含方法:T get()
Function 函数型接口 T R 对类型为 T 的对象应用操作,并返回结果。结果是 R 类型的对象。包含方法:R apply(T t)
Predicate 断定型接口 T boolean 确定类型为 T 的对象是否满足某约束,并返回 boolean 值。包含方法 boolean test(T t)

Consumer 消费接口

根据其中抽象方法的参数列表和返回值类型,在方法中传入参数进行消费

1
2
3
4
5
6
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);

...
}

Supplier 生产型接口

根据其中抽象方法的参数列表和返回值类型,在方法中创建对象,把创建好的对象返回

1
2
3
4
5
6
@FunctionalInterface
public interface Supplier<T> {
T get();

...
}

Function 计算转换接口

根据其中抽象方法的参数列表和返回值,在方法传入的参数计算或转换,将结果返回

1
2
3
4
5
6
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);

...
}

Predicate 判断接口

根据其中抽象方法的参数列表和返回值类型,在方法中对传入的参数条件判断,返回判断结果

1
2
3
4
5
6
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);

...
}

函数式接口常用默认方法

and

在使用 Predicate 接口可能需要判断条件的拼接,而 and 方法相当于使用 &&来拼接两个判断条件

1
2
3
4
5
6
7
8
// 打作家中年龄大于17且姓名的长度大于1的作家
authors.stream()
.filter(author->author.getAge()>17)
.and(new Predicate<Author>() {
public void test() {
return author.getName().length()>1;
}
}).forEach(author->System.out.print(author));

or

在使用 Predicate 接口可能需要判断条件的拼接,而 or 方法相当于使用 || 拼接两个判断条件

1
2
3
4
5
// 打印作家中年龄大于17或者姓名的长度小于2的作家
authors.stream()
.filter(author->author.getAge()>17)
.or(author->author.getName().length()<2)
.forEach(author->author.getName());

negate

Predicate 接口中的方法,而 negate 方法相当于在判断添加 ! 表示取反