Java中的Consumer接口应该如何使用(通俗易懂图解)

应用场景:

第一次程序员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);
        }
    }

内容补充:

  1. 定义与概念
    • 在 Java 中,Consumer接口是一个函数式接口,它属于java.util.function包。函数式接口是指只包含一个抽象方法的接口,Consumer接口中的抽象方法是void accept(T t)。这个方法接收一个类型为T的参数,并且没有返回值。它主要用于对给定的输入参数进行某种操作,比如打印、修改等,但不返回结果。
  2. 使用场景
    • 数据消费 :可以用于遍历一个集合,对集合中的每个元素进行某种操作。例如,有一个包含整数的列表,想要打印出列表中的每个元素,可以使用Consumer接口。
    • 对象属性修改 :在面向对象编程中,用于修改对象的某些属性。比如,有一个Person类,包含name和age属性,通过Consumer接口可以修改Person对象的age属性。
  3. 示例代码
    • 简单的打印操作

      复制代码
      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对象的年龄,并打印出修改后的年龄。

  4. 与其他函数式接口的比较
    • 与Function接口相比,Function接口有返回值,其抽象方法是R apply(T t),R是返回值类型,而Consumer接口没有返回值。例如,Function可以用于将一个整数列表中的每个元素进行平方运算并返回新的列表,Consumer则更侧重于对元素进行操作而不返回新的计算结果。
    • 与Supplier接口不同,Supplier接口没有输入参数,其抽象方法是T get(),主要用于提供一个对象或值,而Consumer是消费一个已经存在的对象或值。

用Java的Consumer接口实现一个统计列表中元素个数的程序

在Java 8中,如何使用Consumer接口与Stream API结合?

除了Consumer接口,Java中还有哪些常用的函数式接口?

相关推荐
涉密IT资质笔记9 小时前
涉密人员脱密期管理规范:期限分级模型、就业限制边界与违规认定标准
java·服务器·前端·网络·数据库
mmsx9 小时前
Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
android·java·dialog·开发语言
huanbailu10 小时前
Qt 跨线程信号槽:connect 返回 true 但槽函数不执行的坑
开发语言·c++·qt·信号槽·跨线程·元类型
u01110267510 小时前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
ZealSinger10 小时前
Go slog生产落地LevelVar与共存
开发语言·后端·golang·go
码上有光10 小时前
Linux:进程间通信——匿名管道通信、命名管道通信
android·java·linux·linux通信·匿名通信·命名通信
落魄实习生10 小时前
Agent Scope Java 2.x 系列【11】AgentState 与状态存储
java·开发语言·ai
HEJOO910 小时前
C++ 虚函数表(vtable)深度解析
开发语言·c++
老王爱玩车10 小时前
深入理解指针5
c语言·开发语言·学习
丹宇码农10 小时前
Go 与 Python 协程(Coroutine)对比演示项目
开发语言·python·golang