java Consumer接口与示例

2023-10-31


Java 8 中的 Consumer 是一个函数接口,它可以接受一个泛型 <T> 类型参数,进行处理后无任何返回值。

  • accept(T) 方法:是 Consumer 函数式接口的函数方法,传入一个任意类型,无返回值,可以用于 Lambda 表达式和方法引用。
  • andThen(Consumer) 方法:可以传入一个 Consumer ,返回组合了两个 Consumer 后的 Consumer ,传入的 Consumer 不能为 null,否则会得到 NullPointerException 。

通俗的来说:
Consumer 相当于一个放东西的容器,你可以在这个容器里放有一个入参的代码块,然后返回 T 类型,当调用 accept(T) 方法的时候才会去执行容器里的代码。

一、consumer使用

示例代码1:

import java.util.function.Consumer;

public class MainServer {
    public static void main(String[] args) throws InterruptedException {
        Consumer<String> first = x -> System.out.println("1."+x.toLowerCase());
        Consumer<String> second = y -> System.out.println("2." + y);
        System.out.println("开始");
        Consumer<String> result = first.andThen(second);
        result.accept("A");
    }
}

输出:

开始
1.a
2.A

示例代码2:

import com.alibaba.fastjson.JSON;
import com.Student;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;

public class MainServer {
    public static void main(String[] args)  {
       List<Student> lisiList = new ArrayList<>();
        Consumer <Student> consumer  = x -> {
            if (x.name.equals("aa")){
                lisiList.add(x);
            }
        };
        Stream.of(
                new  Student("aa",99),
                new  Student("bb",98),
                new  Student("cc",85),
                new  Student("dd",69),
                new  Student("ee",77),
                new  Student("ff",83),
                new  Student("aa",82)
        ).forEach(consumer);

        System.out.println(JSON.toJSONString(lisiList));
    }
}

输出:

[{"name":"aa","score":99},{"name":"aa","score":82}]

示例代码3:

import com.alibaba.fastjson.JSON;
import com.xu.tao.model.Student;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;

public class MainServer {
    public static void main(String[] args) {
        List<Student> lisiList = new ArrayList<>();
        Consumer <Student> consumer  = x -> {
            if (x.name.equals("aa")){
                lisiList.add(x);
            }
        };

        consumer = consumer.andThen(
                x -> lisiList.removeIf(y -> y.score > 90)
        );
        Stream.of(
                new  Student("aa",99),
                new  Student("bb",98),
                new  Student("cc",85),
                new  Student("dd",69),
                new  Student("ee",77),
                new  Student("ff",83),
                new  Student("aa",82)
        ).forEach(consumer);

        System.out.println(JSON.toJSONString(lisiList));
        }
    }

输出:

[{"name":"aa","score":82}]

示例代码4:

public class Student  {
    public String name;
    public int score;

    public Student (String name ,int score){
        this.name=name;
        this.score=score;
    }

    public Student (){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return   name + ": " + score;
    }
}
import com.xu.tao.model.Student;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class MainServer {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student( "John",5),
                new Student("Jane",2),
                new Student("Jack",3)
        );

        Consumer<Student> raiser = e -> {e.score = e.score * 2;};
        raiseStudents(students, System.out::println);
        System.out.println("开始andThen");
        raiseStudents(students, raiser.andThen(System.out::println));
    }

    private static void raiseStudents(List<Student> employees, Consumer<Student> fx) {
        for (Student e : employees) {
            fx.accept(e);
        }
    }
}

输出;

John: 5
Jane: 2
Jack: 3
开始andThen
John: 10
Jane: 4
Jack: 6

二、BiConsumer使用

BiConsumer和上面的Consumer非常相似,只不过BiConsumer可以接受两个泛型 <T> 类型参数,进行处理后无任何返回值。

示例代码一:

import java.util.*;
import java.util.function.BiConsumer;
public class MainServer {
    public static void main(String[] args) throws Exception {
        List<Integer> lista = new ArrayList<>();
        lista.add(2);
        lista.add(1);
        lista.add(3);

        List<Integer> listb = new ArrayList<>();
        listb.add(2);
        listb.add(1);
        listb.add(2);

        // 第一个BiConsumer
        BiConsumer<List<Integer>, List<Integer>> equals = (list1, list2) -> {
            if (list1.size() != list2.size()) {
                System.out.println("False");
            } else {
                for (int i = 0; i < list1.size(); i++)
                    if (list1.get(i) != list2.get(i)) {
                        System.out.println("False");
                        return;
                    }
                System.out.println("True");
            }
        };
        // 第二个BiConsumer
        BiConsumer<List<Integer>, List<Integer> > disp = (list1, list2) -> {
            list1.stream().forEach(a -> System.out.print(a + " "));
            System.out.println();
            list2.stream().forEach(a -> System.out.print(a + " "));
            System.out.println();
        };
        System.out.println("开始执行:");
        // 先执行equals再执行equals,接收的参数是lista和listb
        equals.andThen(disp).accept(lista, listb);
    }
 }   

输出:

开始执行:
False
2 1 3 
2 1 2 

示例代码二:

Student类:

import java.util.List;

public class Student  {
    public String name;
    public int score;
    public List<Integer> sc;

    public Student (String name ,int score,List<Integer> sc){
        this.name=name;
        this.score=score;
        this.sc=sc;
    }

    public Student (){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public List<Integer> getSc() {
        return sc;
    }

    public void setSc(List<Integer> sc) {
        this.sc = sc;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", score=" + score +
                ", sc=" + sc +
                '}';
    }
}

BiConsumerTest类:

import com.test.Student;
import java.util.function.BiConsumer;
import static java.util.Objects.requireNonNull;

public interface BiConsumerTest extends BiConsumer<Student, String> {
    @Override
    default BiConsumerTest andThen(final BiConsumer<? super Student, ? super String> after) {
        requireNonNull(after, "after");
        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}

测试类:

import com.test.Student;
import com.test.BiConsumerTest;
import java.util.*;

public class MainServer {
    public static void main(String[] args) throws Exception {
        Student student1 = new Student("张三", 85, Arrays.asList(95, 87));
        BiConsumerTest biConsumerTest1 = myBiConsumerTest1("姓名-");
        BiConsumerTest biConsumerTest2 = myBiConsumerTest2("成绩-");
        biConsumerTest1.andThen(biConsumerTest2).accept(student1, "序号1:");
    }

    static BiConsumerTest myBiConsumerTest1(String str) {
        //(student, number) -> System.out.println(number + str + student.name)相当于accept方法
        return (student, number) -> System.out.println(number + str + student.name);
    }

    static BiConsumerTest myBiConsumerTest2(String str) {
        //(student, number) -> System.out.println(number + student.name + str + student.score);相当于accept方法
        return (student, number) -> System.out.println(number + student.name + str + student.score);
    }
}

输出:

序号1:姓名-张三
序号1:张三成绩-85

三、其他和Consumer相关的接口

  • BiConsumer<T, U> 处理两个参数

  • DoubleConsumer 处理一个double类型的参数

  • IntConsumer 处理一个int类型的参数

  • LongConsumer 处理一个long类型的参数

  • ObjIntConsumer 处理两个参数,且第二个参数必须为int类型

  • ObjLongConsumer 处理两个参数,且第二个参数必须为long类型


参考:
About return lambda expressions

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java Consumer接口与示例 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐

  • NLP技术中的Tokenization

    作者 Gam Waiciu 单位 QTrade AI研发中心 研究方向 自然语言处理 前言 今天我们来聊一聊 NLP 技术中的 Tokenization 之所以想要聊这个话题 是因为 一方面在 NLP 技术中 Tokenization 是非
  • 网络知识:光纤收发器TX、RX介绍以及两者的区别

    当我们远距离传输时 通常会使用光纤来传输 因为光纤的传输距离很远 一般来说单模光纤的传输距离在10千米以上 而多模光纤的传输距离最高也能达到2千米 而在光纤网络中 我们常常会使用到光纤收发器 那么光纤收发器怎么连 我们一起来了解下 一 光纤
  • 自媒体月入过万的运营攻略,轻松上手

    很多自媒体新手羡慕大V月入过万 同是做自媒体运营 为什么自己不能实现营收过万呢 给大家分享一套月入过万的运营攻略 适合新手们去操作 收藏起来直接套用到运营哦 1 账号定位 清晰的定位是影响后期变现的关键因素 选一个后期容易变现的领域能帮自己
  • ajax net::err_connection_refused,javascript - How to handle net::ERR_CONNECTION_REFUSED in jquery aj...

    It appears that when jqXHR readyState i e the readyState field of the first parameter to the ajax fail method is 0 that
  • 调用织梦搜索功能

    织梦默认的搜索框
  • 使用C对TOML文件的解析

    使用C对TOML文件的解析 toml书写语法 解析toml文件 测试输出内容如下 TOML是前GitHub CEO Tom Preston Werner 于2013年创建的语言 其目标是成为一个小规模的易于使用的语义化配置文件格式 TOML
  • HJT212协议

    HJ T212是由国家环保行业制定的数据传输标准协议 目前广泛使用的是HJ T212 2005通信协议 该协议在2005年制定 并于2006年2月1日正式实施 HJ T212标准不规定数据采集传输仪与监控仪器仪表的通讯方式 可以采用RS23
  • Mali GPU OpenGL ES 应用性能优化--基本概念

    1 基本概念 1 1 Mali GPU家族 Mali GPU家族都包含以下通用的硬件 基于分块的延迟渲染 Mali GPU把framebuffer分成许多块 16 x 16像素 然后一块一块地进行渲染 基于分块的渲染是有效的 因为像素值使用
  • matlab中if elseif语句,Matlab if…elseif…elseif…else…end语句

    if语句后面可以有一个 或多个 可选elseif 和一个else语句 这对于测试各种条件非常有用 当使用if elseif else语句时 请记住几点 if可以有零个或一个else 它必须在elseif之后 if可以有零到多个elseif
  • (python编程)k-shell的实现

    一 k shell 算法 改错 他发的代码报错 def kshell graph importance dict ks 1 while graph nodes temp node degrees dict for i in graph de
  • python之标准库使用

    目录 一 标准库 二 字符串操作 三 字符串类型 四 时间操作 五 文件基本方法及操作 文件基本方法 文件操作 一 标准库 Python 标准库非常庞大 所提供的组件涉及范围十分广泛 正如以下内容目录所显示的 这个库包含了 Python中的
  • Activiti7 监听器【十四】

    Activiti 7系列文章目录 文章代码下载 Activiti7 工作流设计器 一 Activiti7 创建表 二 Activiti7 表结构介绍 三 Activiti7 设计器创建流程 四 Activiti7 部署流程 五 Activi
  • maven打包出错:Failed to execute goal org.sp

    Failed to execute goal org springframework boot spring boot maven plugin 2 2 13 RELEASE repackage default on project bla
  • 数学建模——数据分析方法

    一 常见数据分析软件 Excel office三件套之一 R语言 Eviews origin 图形分析工具 SPSS 统计分析与数据挖掘 MATLAB 墙裂推荐 python 墙裂推荐 SAS 二 统计性描述 均值 mean x
  • 第一次参加蓝桥杯的心得

    随着我的4道题的答案提交后 蓝桥杯第十届比赛落下帷幕 这其中我也是参赛者 对于这次比赛 虽然我是一位小白 但是我也有不少的感悟 因为这一次也是我从小到大参加的第一次大型竞赛 所以我做了以下的总结 这次的比赛是在长沙理工大学比赛 所以对于我来
  • Swin-Unet:Swin Transformer在医学分割上的首次尝试

    Swin Unet Swin Transformer在医学分割上的首次尝试 前言 最近小编主要在搞一些医学图像分割的工作 也跑了一下Swin Unet 之前看到也看到过这篇Swin Unet 其实五月份就看到了hhhh 决定搬运过来 实际上
  • 前端报错500

    后台代码错误无法返回值 检查后台代码
  • log4j:WARN No appenders could be found for logger 的解决方法

    一 SSH在使用Log4j进行日志管理时常会遇到这个异常 log4j WARN No appenders could be found for logger org springframework web context ContextLo
  • STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一 SHT30温湿度传感器原理图 二 代码部分 1 SHT30 c文件 2 SHT30 h文件 总结 前言 SHT30是一种常见的温湿度传感器 该传感器广泛应用于各种场景 小米的温湿度传感器就是使用的SHT30 本文是已硬件
  • java Consumer接口与示例

    目录 一 consumer使用 示例代码1 示例代码2 示例代码3 示例代码4 二 BiConsumer使用 示例代码一 示例代码二 三 其他和Consumer相关的接口 Java 8 中的 Consumer 是一个函数接口 它可以接受一个