码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【日更】Consumer<T>和BiConsumer<T,U>


    共通

    都是函数式接口(Functional Interface)。

    函数式接口

    就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
    可以被隐式转换为lambda表达式

    Consumer

    这个Consumer接口表示(或者定义)了对输入参数的一系列处理规则,这个操作需要有一个输入参数,就是一个没有返回值的匿名函数。

    /**
     * 表示接受单个输入参数但不返回结果的操作。 与大多数其他功能接口不同,consumer的操作是预期的 
     */
    public interface Consumer<T> {
     
        /**
         * Performs this operation on the given argument.
         *
         * @param t the input argument
         */
         // 将入参T,按照你定义的规则进行处理
        void accept(T t);
     
        /**
         * Returns a composed {@code Consumer} that performs, in sequence, this
         * operation followed by the {@code after} operation. If performing either
         * operation throws an exception, it is relayed to the caller of the
         * composed operation.  If performing this operation throws an exception,
         * the {@code after} operation will not be performed.
         *
         * @param after the operation to perform after this operation
         * @return a composed {@code Consumer} that performs in sequence this
         * operation followed by the {@code after} operation
         * @throws NullPointerException if {@code after} is null
         */
        default Consumer<T> andThen(Consumer<? super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    Consumer 内部方法
    1. accept方法
      接收一个入参,按照定义的规则处理入参
    public static void main(String[] args){
    	String test1 = "我";
    	String test2 = "你";
    	String test3 = "大家";
    	StringBuilder builderInput = new StringBuilder("我要买");
    	Consumer<String> consumer = (string) -> System.out.println(string+"爱中国");
    	consumer.accept(test1);
    	consumer.accept(test2);
    	consumer.accept(test3);
    
    	Consumer<StringBuilder> consumer2 = (builder) -> builder.append("玛莎拉蒂");
    	System.out.println("accept 前:"+builderInput.toString());
    	consumer2.accept(builderInput);
    	System.out.println("accept 后:"+builderInput.toString());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    溯源可以在jdk源码中的List的foreach方法看到

    // forEach方法把增强for的逻辑封装到方法体了(封装的是逻辑代码)。
    // 在这段逻辑代码中,action.accept(t);代表的是消费的函数体本身
    // 或者是我们写的任意代码(消费的是函数)
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. andThen 方法
      多个consumer的组合,定义的多个处理流程,链式化处理(流水线作业)。输入是一个规则,返回一个新的规则。
      先判断入参的consumer是不是null;为null则抛出异常。然后执行consumer自身定义的规则,最后输入consumer的规则。
    default Consumer<T> andThen(Consumer<? super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
    }
     
    public static void main(String[] args) {
     
            Consumer<StringBuilder> consumer1 = (builder)-> builder.append("->步骤1");
            Consumer<StringBuilder> consumer2 = (builder)-> builder.append("->步骤2");
            Consumer<StringBuilder> consumer3 = (builder)-> builder.append("->步骤3");
            Consumer<StringBuilder> newConsumer = consumer1.andThen(consumer2).andThen(consumer3);
            StringBuilder builder = new StringBuilder("原始原件");
            newConsumer.accept(builder);
            System.out.println(builder.toString());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    BiConsumer

    和Consumer唯一的区别就是接收的入参是两个

    public interface BiConsumer<T, U> {
     
        void accept(T t, U u);
     
      
        default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
            Objects.requireNonNull(after);
     
            return (l, r) -> {
                accept(l, r);
                after.accept(l, r);
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    参考

    https://blog.csdn.net/qq_28683865/article/details/125024767
    https://blog.csdn.net/qq_51741292/article/details/125622428?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-125622428-blog-125024767.t0_edu_mix&spm=1001.2101.3001.4242.2&utm_relevant_index=4
    https://blog.csdn.net/qq_42543063/article/details/113932629?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-113932629-blog-125024767.t0_edu_mix&spm=1001.2101.3001.4242.1&utm_relevant_index=3

  • 相关阅读:
    Zookeeper系列——1Zookeeper简介及部署
    Kafka-入门及简单示例
    虚拟机下面安装Centos7的详解
    猿创征文 | 万字总结C文件
    父进程循环创建三个子进程, 并用sigchld完成对子进程的回收
    Transwarp Inceptor中的对象
    【Python黑科技】制作一个定时小闹钟,自动发送系统通知提示(保姆级图文+实现代码)
    报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘
    数据库学习之表的增删查改
    大数据培训技术Kylin核心算法逐层构建算法
  • 原文地址:https://blog.csdn.net/Mabanana/article/details/127424500
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号