应用场景:
第一次程序员A写好了个基础的遍历方法:
java
public class Demo1 {
public static void main(String[] args) {
//假设main方法为程序员B写的,此时需要去调用A写好的一个遍历方法
//1.如果此时B突然发现想将字符串以小写的形式打印出来,则去请求A修改
LinkedList<String > list=new LinkedList<>();
list.add("Acb");
list.add("Vudh");
list.add("hsuU");
print(list);
}
//A程序员写的遍历方法
public static void print(LinkedList<String> list){
for (String s : list) {
System.out.println(s);
}
}
}
第二次程序员A完成了字符转小写的遍历方法:
java
public static void main(String[] args) {
//假设main方法为程序员B写的,此时需要去调用A写好的一个遍历方法
//1.如果此时B突然发现想将字符串以小写的形式打印出来,则去请求A修改
LinkedList<String > list=new LinkedList<>();
list.add("Acb");
list.add("Vudh");
list.add("hsuU");
print(list);
}
//A程序员写的遍历方法
public static void print(LinkedList<String> list){
for (String s : list) {
System.out.println(s.toLowerCase());
}
}
第三次程序员A直接将接口调用给了B,B可以根据需求自己去实现打印形式:
java
public static void main(String[] args) {
//假设main方法为程序员B写的,此时需要去调用A写好的一个遍历方法
//1.如果此时B突然发现想将字符串以小写的形式打印出来,则去请求A修改
LinkedList<String > list=new LinkedList<>();
list.add("Acb");
list.add("Vudh");
list.add("hsuU");
print(list, new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s.toUpperCase());
}
});
}
//A程序员写的遍历方法,将consumer接口调用给B
public static void print(LinkedList<String> list,Consumer<String> consumer ){
for (String s : list) {
consumer.accept(s);
}
}
内容补充:
- 定义与概念
- 在 Java 中,
Consumer
接口是一个函数式接口,它属于java.util.function
包。函数式接口是指只包含一个抽象方法的接口,Consumer
接口中的抽象方法是void accept(T t)
。这个方法接收一个类型为T
的参数,并且没有返回值。它主要用于对给定的输入参数进行某种操作,比如打印、修改等,但不返回结果。
- 在 Java 中,
- 使用场景
- 数据消费 :可以用于遍历一个集合,对集合中的每个元素进行某种操作。例如,有一个包含整数的列表,想要打印出列表中的每个元素,可以使用
Consumer
接口。 - 对象属性修改 :在面向对象编程中,用于修改对象的某些属性。比如,有一个
Person
类,包含name
和age
属性,通过Consumer
接口可以修改Person
对象的age
属性。
- 数据消费 :可以用于遍历一个集合,对集合中的每个元素进行某种操作。例如,有一个包含整数的列表,想要打印出列表中的每个元素,可以使用
- 示例代码
-
简单的打印操作
import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class ConsumerExample { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(1); numberList.add(2); numberList.add(3); // 使用Consumer接口打印列表中的每个元素 Consumer<Integer> printConsumer = num -> System.out.println(num); numberList.forEach(printConsumer); } }
-
在这个示例中,首先创建了一个包含整数的
ArrayList
。然后定义了一个Consumer
类型的变量printConsumer
,它的accept
方法实现是通过 Lambda 表达式num -> System.out.println(num)
来定义的,即对于传入的整数进行打印操作。最后,使用forEach
方法遍历numberList
,并将每个元素传递给printConsumer
的accept
方法进行打印。 -
对象属性修改示例
class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class ConsumerObjectExample { public static void main(String[] args) { Person person = new Person("Alice", 20); // 定义一个Consumer来修改Person对象的年龄 Consumer<Person> ageModifier = p -> p.age = p.age + 1; ageModifier.accept(person); System.out.println("修改后的年龄: " + person.getAge()); } }
-
在这里,定义了一个
Person
类,包含name
和age
属性。在main
方法中创建了一个Person
对象。然后定义了一个Consumer
,它的accept
方法实现是将传入的Person
对象的年龄加 1。最后通过accept
方法修改person
对象的年龄,并打印出修改后的年龄。
-
- 与其他函数式接口的比较
- 与
Function
接口相比,Function
接口有返回值,其抽象方法是R apply(T t)
,R
是返回值类型,而Consumer
接口没有返回值。例如,Function
可以用于将一个整数列表中的每个元素进行平方运算并返回新的列表,Consumer
则更侧重于对元素进行操作而不返回新的计算结果。 - 与
Supplier
接口不同,Supplier
接口没有输入参数,其抽象方法是T get()
,主要用于提供一个对象或值,而Consumer
是消费一个已经存在的对象或值。
- 与
用Java的Consumer接口实现一个统计列表中元素个数的程序
在Java 8中,如何使用Consumer接口与Stream API结合?
除了Consumer接口,Java中还有哪些常用的函数式接口?