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

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

在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。