Java 1.8 Consumer 消费者函数式接口

更新时间 2023-07-18 18:30:49

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

Consumer 接口代表一个接受一个参数并且不返回结果的操作。它在 Java 中被广泛用于遍历集合或执行消费型操作。

本小节中将深入介绍 Java 1.8 中的 Consumer 接口,并通过示例代码演示如何使用它。

Consumer 接口概览

java.util.function 包中,Consumer 接口定义如下:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}
  • T 表示输入参数的类型。
  • accept(T t) 是 Consumer 接口中唯一的抽象方法,用于对输入参数 t 进行操作。

Consumer 接口是一个泛型接口,它可以接受不同类型的参数。

使用 Consumer 接口

让我们通过几个示例来说明如何使用 Consumer 接口。

示例 1:打印元素

创建一个 Consumer 接口实例,用于打印集合中的元素。

Consumer<String> printString = str -> System.out.println(str);

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
names.forEach(printString);

在这个例子中,我们创建了一个 Consumer 对象 printString,它用于打印字符串。然后,我们使用 forEach 方法遍历集合,并将每个元素传递给 Consumer 的 accept() 方法,实现打印操作。

示例 2:消费元素

使用 Consumer 接口对集合中的元素进行消费型操作。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Consumer<Integer> multiplyByTwo = num -> {
	// 对入参进行乘 2 操作
    int result = num * 2;
    System.out.println("Result: " + result);
};

numbers.forEach(multiplyByTwo);

在这个例子中,我们创建了一个 Consumer 对象 multiplyByTwo,它将传入的整数乘以2,并输出结果。然后,我们使用 forEach 方法遍历集合,并将每个元素传递给 Consumer 的 accept() 方法,实现对元素的消费型操作。

示例 3:集合元素求和

使用 Consumer 接口对集合中的元素进行求和操作。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 使用 AtomicInteger 来保存结果
AtomicInteger sum = new AtomicInteger();

Consumer<Integer> addToSum = num -> sum.addAndGet(num);

numbers.forEach(addToSum);

System.out.println("Sum: " + sum); // 输出 "Sum: 15"

在这个例子中,我们创建了一个 Consumer 对象 addToSum,它将传入的整数添加到 AtomicInteger 中,并实现对元素的求和操作。然后,我们使用 forEach 方法遍历集合,并将每个元素传递给 Consumer 的 accept() 方法,实现对元素的求和。

Consumer 的组合

Consumer 还提供了一些默认方法用于函数的组合:

  • andThen(Consumer after): 返回一个新的 Consumer,它表示当前 Consumer 和另一个 Consumer 的顺序执行。

下面是一个组合示例:

Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
Consumer<String> printLowerCase = str -> System.out.println(str.toLowerCase());

Consumer<String> printAndThen = printUpperCase.andThen(printLowerCase);

printAndThen.accept("Hello, World!"); // 输出 "HELLO, WORLD!" 和 "hello, world!"

在这个例子中,我们首先创建了两个 Consumer 对象 printUpperCaseprintLowerCase,分别打印字符串的大写和小写形式。然后,我们使用 andThen() 方法将这两个 Consumer 组合成一个新的 Consumer printAndThen,它先执行打印大写形式,然后再执行打印小写形式。

总结

Java 1.8 中的 Consumer 接口为函数式编程提供了重要的支持。通过使用 Consumer 接口,我们可以轻松地定义并执行一个接受一个参数并且不返回结果的操作。Consumer 接口特别适用于遍历集合或执行消费型操作。