Java 8常用函数式接口详解:Supplier、Consumer、Predicate与Function

顾星河
顾星河
发布时间:2026-10-13 | 5人浏览过
原创

在Java 8引入Lambda表达式后,java.util.function包提供了一系列常用的函数式接口以支持典型场景。本文将结合实例详细解析Supplier(生成)、Consumer(消费)、Predicate(判断)及Function(转换)四大核心接口,并探讨基本数据类型的专用接口以避免自动装箱拆箱的性能损耗。

准备:基础实体类定义

为了演示各类接口,首先定义一个表示口罩的简单类Mask:

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; }
}

第1步:使用Supplier获取对象实例

Supplier<T>是一个生产型接口,没有入参,通过get()方法返回泛型对象T。其源码位于java.util.function包下:

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

使用Lambda表达式创建Mask实例:

Supplier<Mask> supplier = () -> new Mask("3M", "N95");
Mask mask = supplier.get();
System.out.println("Brand: " + mask.getBrand() + ", Type: " + mask.getType());

运行结果为:Brand: 3M, Type: N95。需注意每次调用get()都会创建一个新对象。

第2步:使用Consumer处理数据

Consumer<T>是消费者型接口,接收泛型T作为参数,无返回值。源码如下:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

结合上文的Supplier,先生产后消费:

Consumer<Mask> consumer = (Mask m) -> {
    System.out.println("品牌: " + m.getBrand() + ", 类型: " + m.getType());
};
consumer.accept(supplier.get());

第3步:使用Predicate进行条件判断

Predicate<T>用于逻辑判断,输入T返回boolean。源码如下:

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

判断口罩类型是否为指定值:

Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
System.out.println(isN95.test(supplier.get())); // true

第4步:使用Function进行数据转换

Function<T, R>用于将输入T转换为输出R。源码如下:

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

提取口罩属性:

Function<Mask, String> brandFunc = m -> m.getBrand();
String b = brandFunc.apply(supplier.get()); // 3M

性能优化:基本数据类型专用接口

上述接口均为泛型引用类型,若用于int/long等基础类型会引发装箱拆箱。JDK提供了对应的专用接口以提升性能。

例如获取时间戳,应使用LongSupplier而非Supplier<Long>:

LongSupplier timeSupplier = () -> System.currentTimeMillis();
long now = timeSupplier.getAsLong();

补充:常用接口速查表

分类接口名关键方法签名
Supplier系列BooleanSupplier() → boolean
DoubleSupplier() → double
IntSupplier() → int
LongSupplier() → long
ObjDoubleConsumer(T, double) → void

更多类似接口如IntPredicate、ToIntFunction等遵循相同命名规范,可根据具体类型选择以避免性能损耗。

以上就是Java Lambda表达式常用的函数式接口的详细内容,更多关于Java函数式编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表