Consumer
是 Java 中一个非常有用的函数式接口,定义在 java.util.function
包中。它接收一个输入参数并进行某些操作但不返回任何结果。Consumer
接口主要用于执行带有副作用的操作,如打印日志、修改对象状态等。
下面是一些关于如何使用 Consumer
接口的详细示例:
基本用法
示例1:打印字符串
使用 Consumer
打印传入的字符串:
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
Consumer<String> printConsumer = (s) -> System.out.println(s);
printConsumer.accept("Hello, World!"); // 输出: Hello, World!
}
}
示例2:修改对象状态
假设我们有一个 Person
类,我们可以使用 Consumer
修改 Person
对象的状态:
import java.util.function.Consumer;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class ConsumerExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
Consumer<Person> updateName = p -> p.setName("Jane");
updateName.accept(person);
System.out.println(person); // 输出: Person{name='Jane', age=30}
}
}
结合使用 andThen
方法
Consumer
接口有一个 default
方法 andThen
,可以将两个 Consumer
组合起来,顺序执行。
示例3:链式操作
使用 andThen
链式执行多个 Consumer
:
import java.util.function.Consumer;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class ConsumerExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
Consumer<Person> updateName = p -> p.setName("Jane");
Consumer<Person> updateAge = p -> p.setAge(35);
Consumer<Person> updatePerson = updateName.andThen(updateAge);
updatePerson.accept(person);
System.out.println(person); // 输出: Person{name='Jane', age=35}
}
}
在集合中的使用
Consumer
常用于集合的元素遍历中,如使用 forEach
方法。
示例4:遍历列表并执行操作
遍历列表并打印每个元素:
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Consumer<String> printConsumer = (name) -> System.out.println(name);
names.forEach(printConsumer);
// 输出:
// Alice
// Bob
// Charlie
}
}
自定义复杂操作
通过自定义 Consumer
执行更复杂的操作,例如,计算总和:
示例5:计算总和
使用 Consumer
累加整数列表中的所有值:
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
class Sum {
private int total = 0;
public void add(int number) {
total += number;
}
public int getTotal() {
return total;
}
}
Sum sum = new Sum();
Consumer<Integer> sumConsumer = sum::add;
numbers.forEach(sumConsumer);
System.out.println("Sum: " + sum.getTotal()); // 输出: Sum: 15
}
}
这些示例展示了 Consumer
在 Java 中的多种用法,包括基本操作、组合操作、在集合中的使用以及自定义复杂操作。通过 Consumer
接口,您可以方便地处理各种无返回值的操作,提高代码的可读性和可维护性。