java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java consumer 与 supplier 接口

Java 中的 Consumer 与 Supplier 接口使用场景与示例

作者:潜意识Java

文章介绍了Java 8中函数式接口的核心概念,Consumer与Supplier接口使用场景与示例,重点对比了Consumer(消费数据)与Supplier(供给数据)的区别,感兴趣的朋友跟随小编一起看看吧

一、函数式接口基础概念

在 Java 8 引入函数式编程特性后,函数式接口成为核心概念之一。它是指仅包含一个抽象方法的接口,可通过 Lambda 表达式或方法引用来实现。Consumer 和 Supplier 作为 Java 函数式接口的典型代表,在流式编程、设计模式及异步处理中被广泛应用。

二、Consumer 接口:数据消费者

1. 接口定义与核心方法

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

2. 使用场景与示例

场景 1:集合遍历处理

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 传统遍历
for (String name : names) {
    System.out.println("Hello, " + name);
}
// Consumer 实现
names.forEach(name -> System.out.println("Hello, " + name));
// 方法引用简化
names.forEach(System.out::println);

场景 2:自定义数据处理

// 定义消费逻辑:将字符串转为大写并打印
Consumer<String> upperCaseConsumer = str -> {
    String upper = str.toUpperCase();
    System.out.println("Processed: " + upper);
};
upperCaseConsumer.accept("java"); // 输出: Processed: JAVA

场景 3:链式消费(andThen)

// 组合多个消费操作
Consumer<Integer> print = num -> System.out.println("Number: " + num);
Consumer<Integer> square = num -> System.out.println("Square: " + num * num);
// 先打印再计算平方
print.andThen(square).accept(5);
/* 输出:
Number: 5
Square: 25
*/

三、Supplier 接口:数据供给者

1. 接口定义与核心方法

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

2. 使用场景与示例

场景 1:延迟对象创建

// 避免无意义的对象创建
Supplier<Connection> connectionSupplier = () -> {
    System.out.println("Creating new database connection...");
    return DriverManager.getConnection("jdbc:mysql://localhost/db");
};
// 仅在需要时调用get()创建对象
if (needDatabaseAccess()) {
    Connection conn = connectionSupplier.get();
    // 使用连接...
}

场景 2:异常处理中的延迟计算

// 传统方式:先计算再判断,可能浪费资源
String result = expensiveCalculation();
if (result == null) {
    result = "default value";
}
// Supplier 优化:仅在需要时计算默认值
String optimizedResult = Optional.ofNullable(expensiveCalculation())
        .orElseGet(() -> {
            System.out.println("Using default value...");
            return "default value";
        });

场景 3:工厂模式与对象供给

// 定义对象创建供给者
Supplier<Person> personSupplier = () -> new Person("Default Name", 18);
// 批量创建对象
List<Person> defaultPersons = IntStream.range(0, 10)
        .mapToObj(i -> personSupplier.get())
        .collect(Collectors.toList());

四、Consumer 与 Supplier 的核心区别

维度Consumer 接口Supplier 接口
参数接收 1 个输入参数无输入参数
返回值void(仅消费数据)返回泛型结果(供给数据)
核心行为对数据进行处理或消费按需生成或供给数据
典型场景遍历处理、日志记录、数据转换延迟初始化、默认值供给、工厂模式
接口方法accept(T t)、andThen(Consumer)get()
与 Lambda 结合(T t) -> { ... }(有参无返回)() -> { ... }(无参有返回)

五、高级应用:组合使用 Consumer 与 Supplier

场景:惰性数据处理框架

// 定义数据处理流程:先由Supplier获取数据,再由Consumer处理
public static <T> void processData(Supplier<T> dataSupplier, Consumer<T> dataConsumer) {
    try {
        T data = dataSupplier.get(); // 惰性获取数据
        dataConsumer.accept(data);   // 处理数据
    } catch (Exception e) {
        System.err.println("Processing error: " + e.getMessage());
    }
}
// 使用示例
processData(
    () -> {
        System.out.println("Fetching data from database...");
        return jdbcTemplate.queryForObject("SQL", ResultSetExtractor);
    },
    data -> {
        System.out.println("Processing data: " + data);
        // 复杂数据处理逻辑
    }
);

六、与其他函数式接口的关联

// 使用Function转换数据,Consumer消费结果
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.stream()
    .map(num -> num * 2)        // Function<Integer, Integer>
    .forEach(System.out::println); // Consumer<Integer>

七、性能与设计考量

总结

Consumer 和 Supplier 作为 Java 函数式编程的基础接口,分别代表了 "数据消费" 与 "数据供给" 的核心场景。合理使用它们不仅能简化代码结构,还能实现延迟计算、惰性初始化等优化。在实际开发中,结合 Stream API、Optional 或设计模式(如工厂模式、策略模式),可充分发挥函数式接口的灵活性和表现力,写出更简洁、可维护的代码。

到此这篇关于Java 中的 Consumer 与 Supplier 接口使用场景与示例的文章就介绍到这了,更多相关java consumer 与 supplier 接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文