失去人性, 失去很多; 失去兽性, 失去一切.--《三体》
在 Java8 支持 Lambda 表达式以后, 为了满足 Lambda 表达式的一些典型使用场景, JDK 为我们提供了大量常用的函数式接口. 它们主要在 java.util.function 包中, 下面简单介绍几个其中的接口及其使用示例.
Supplier 接口
Supplier 接口是对象实例的提供者, 定义了一个名叫 get 的抽象方法, 它没有任何入参, 并返回一个泛型 T 对象, 具体源码如下:
- package java.util.function;
- @FunctionalInterface
- public interface Supplier<T> {
- T get();
- }
源码比较简单, 我们来个例子. 这是一个之前提过的表示口罩的类:
- package one.more.study;
- /**
- * 口罩
- */
- public class Mask {
- public Mask(String brand, String type) {
- this.brand = brand;
- this.type = type;
- }
- /**
- * 品牌
- */
- private String brand;
- /**
- * 类型
- */
- private String type;
- public String getBrand() {
- return brand;
- }
- public void setBrand(String brand) {
- this.brand = brand;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- }
下面我们使用 Lambda 表达式声明一个 Supplier 的实例:
Supplier<Mask> supplier = () -> new Mask("3M", "N95");
用它来创建品牌为 3M, 类型为 N95 的 Mask 实例:
- Mask mask = supplier.get();
- System.out.println("Brand:" + mask.getBrand() + ", Type:" + mask.getType());
运行结果如下:
Brand: 3M, Type: N95
特别需要注意的是, 本例中每一次调用 get 方法都会创建新的对象.
Consumer 接口
Consumer 接口是一个类似消费者的接口, 定义了一个名叫 accept 的抽象方法, 它的入参是一个泛型 T 对象, 没有任何返回(void), 主要源码如下:
- package java.util.function;
- @FunctionalInterface
- public interface Consumer<T> {
- void accept(T t);
- }
结合上面的 Supplier 接口, 我们来个例子:
- Supplier<Mask> supplier = () -> new Mask("3M", "N95");
- Consumer<Mask> consumer = (Mask mask) -> {
- System.out.println("Brand:" + mask.getBrand() + ", Type:" + mask.getType());
- };
- consumer.accept(supplier.get());
首先使用 Lambda 表达式声明一个 Supplier 的实例, 它是用来创建品牌为 3M, 类型为 N95 的 Mask 实例; 再使用 Lambda 表达式声明一个 Consumer 的实例, 它是用于打印出 Mask 实例的相关信息; 最后 Consumer 消费了 Supplier 生产的 Mask. 运行结果如下:
Brand: 3M, Type: N95
Predicate 接口
Predicate 接口是判断是与否的接口, 定义了一个名叫 test 的抽象方法, 它的入参是一个泛型 T 对象, 并返回一个 boolean 类型, 主要源码如下:
- package java.util.function;
- @FunctionalInterface
- public interface Predicate<T> {
- boolean test(T t);
- }
结合上面的 Supplier 接口, 我们来个例子:
- Supplier<Mask> supplier = () -> new Mask("3M", "N95");
- Predicate<Mask> n95 = (Mask mask) -> "N95".equals(mask.getType());
- Predicate<Mask> kn95 = (Mask mask) -> "KN95".equals(mask.getType());
- System.out.println("是否为 N95 口罩:" + n95.test(supplier.get()));
- System.out.println("是否为 KN95 口罩:" + kn95.test(supplier.get()));
首先使用 Lambda 表达式声明一个 Supplier 的实例, 它是用来创建品牌为 3M, 类型为 N95 的 Mask 实例; 再使用 Lambda 表达式声明一个 Predicate 的实例 n95, 它是用于判断是否为 N95 口罩; 再使用 Lambda 表达式声明一个 Predicate 的实例 kn95, 它是用于判断是否为 KN95 口罩; 最后分别用两个 Predicate 判断 Supplier 生产的 Mask. 运行结果如下:
是否为 N95 口罩: true
是否为 KN95 口罩: false
- package java.util.function;
- @FunctionalInterface
- public interface Function<T, R> {
- R apply(T t);
- }
- Supplier<Mask> supplier = () -> new Mask("3M", "N95");
- Function<Mask, String> brand = (Mask mask) -> mask.getBrand();
- Function<Mask, String> type = (Mask mask) -> mask.getType();
- System.out.println("口罩品牌:" + brand.apply(supplier.get()));
- System.out.println("口罩类型:" + type.apply(supplier.get()));
- package java.util.function;
- @FunctionalInterface
- public interface BiFunction<T, U, R> {
- R apply(T t, U u);
- }
- BiFunction<String,String,Mask> biFunction = (String brand, String type) -> new Mask(brand, type);
- Mask mask = biFunction.apply("3M", "N95");
- System.out.println("Brand:" + mask.getBrand() + ", Type:" + mask.getType());
- Supplier<Long> supplier = () -> System.currentTimeMillis();
- long timeMillis = supplier.get();
- LongSupplier supplier = () -> System.currentTimeMillis();
- long timeMillis = supplier.getAsLong();
来源: https://www.cnblogs.com/heihaozi/p/12557522.html