函数式接口入门简介

news2024/12/25 0:52:25

这里写目录标题

  • 引子
  • 四种函数式接口-简单Demo
  • 四种函数式接口介绍
  • 函数式接口实战-代码对比

引子

  1. 只包含一个抽象方法的接口,就称为函数式接口。
  2. 来源:java.util.function

我想在方法内直接定义方法直接获得结果,主要是也是为了配置lambda表达式进行操作,我在项目代码中引入了如下code(对代码进行保密处理)

    private Device DDDD(JSONObject json) {
        Device device = new Device();

       	device.setCode((String) json.get(A.Code));
        device.setCategoryCode((String) json.get(A.CategoryCode));
        device.setDeviceCode((String) json.get(A.deviceCode));
        device.setDeviceNum(Long.parseLong(json.get(A.DeviceNum).toString()) )return device;
    }

通过函数式接口进行改写

BiConsumer、BiFunction、BiPrediate 是 Consumer、Function、Predicate 的扩展,可以传入多个参数,没有 BiSupplier 是因为 Supplier 没有入参。

private Device DDDD(JSONObject json) {
    Device device = new Device();
    List<Object> objectsList = Arrays.asList(
            json.get(A.Code),
            json.get(A.CategoryCode),
            json.get(A.deviceCodeName),
            json.get(A.DeviceNum));
    BiConsumer<List<Object>,Device> consumer = (List<Object> list, Device d) -> {
        d.setCode((String) list.get(0));
        d.setCategoryCode((String) list.get(1));
        d.setDeviceCode((String) list.get(2));
        d.setDeviceNum(Long.parseLong(list.get(3).toString()));
    };
    consumer.accept(objectsList, device);
    return device;
}

ok,测试成功

函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是 Lambda,所以函数式接口就是可以适用于Lambda使用的接口。

四种函数式接口-简单Demo

给出一个简单demo进行了解

    public static void main(String[] args) {
        int ss = 0;
        Consumer consumer = s -> {
            s = (int) s + 1;
            System.out.println("ss" + s);
        };
        consumer.accept(ss);
        String str = "aa";
        Consumer strC = s -> {
            s = s + "1";
            System.out.println("str   " + s);
        };
        strC.accept(str);
        System.out.println(str);

        Function<String, String> function = (s) -> {
            s = s + "1";
            System.out.println("---function---");
            return s;
        };
        str = function.apply(str);
        System.out.println(str);

        Predicate predicate = (s)->{
            return s.equals("aa1");
        };
        System.out.println(predicate.test(str));
    }

结果展示如下
在这里插入图片描述

四种函数式接口介绍

  • Consumer<T> 消费型接口

void accept(T t) 接收一个参数进行消费,无返回结果 (因为没有返回值,接口里面执行内容和调用方没什么关联 – 解耦

// 通过Consumer 消费输出传入的参数
Consumer consumer= i -> System.out.println(i);
consumer.accept("test consumer accept");
  • Supplier<T> 供给型接口

T get() 返回一个自定义数据( 无参数,有返回值)

// 通过Supplier 创建一个字符串 
Supplier<String> supplier= () -> new String("test Supplier get");
String str = supplier.get();
System.out.println(str);
  • Function<T,R> 函数型接口

R apply(T t) 传入一个参数,返回需要的结果

//Function<参数, 返回值>
Function<String, String> nameFunction = (i) -> "hello, name = { " + i + " }";
Function<Integer, String> ageFunction = (i) -> "age = { " + i + " }";
String name = nameFunction.apply("Tom");
String age = ageFunction.apply(21);
System.out.println("ageFunction = " + name);
System.out.println("ageFunction = " + age);

//先执行ageFunction,然后将得到的结果传给f1执行。
String ageName = nameFunction.compose(ageFunction).apply(21);
System.out.println("ageName = " + ageName);

//获得输入参数意义的结果字符串
String identity = Function.identity().apply(" identity ") + "生成";
System.out.println("identity = " + identity); 

  • Predicate<T,R> 断言型接口

boolean test(T t) 传入一个参数,返回布尔值(满足:true,不满足:false)

// equals:判断传入参数是否等价于strive
Predicate<String> v1 = (i) -> "strive".equals(i);
//endsWith:判断字符串是否以指定的后缀结束
Predicate<String> v2 = (i) -> i.endsWith("ive");

boolean test = v1.test("strive");
System.out.println("test = " + test);

// isEqual : 当参数为null,使用==判断,否则使用equal方法判断
Predicate<String> p = Predicate.isEqual("strive");
boolean isEqual = p.test("strive");
System.out.println("isEqual = " + isEqual);

boolean negate = v1.negate().test("hello");
System.out.println("negate = " + negate);

//等价于 v2.test(arg) && v1.test(arg)
boolean and = v1.and(v2).test("strive");
System.out.println("and = " + and);

//等价于 v2.test(arg) || v1.test(arg)
boolean or = v1.or(v2).test("hello");
System.out.println("or = " + or);

在这里插入图片描述

函数式接口实战-代码对比

    private String[] get(Map<String, String> pM) {
        int rrLen = 0;
        for (int i = 0; i < CV.InfoBoardNum; i++) {
            String content = pM.get(CV.InfoBoardContent + i);
            if (!StringUtils.isEmpty(content)) {
                rrLen++;
            }
        }
        if (rrLen>0){
            String[] numStr = new String[rrLen];
            int CCCn = 0;
            for (int i = 0; i < CV.InfoBoardNum; i++) {
                //这里需要确定对应的点位是否正确
                String content = pM.get(CV.InfoBoardContent + i);
                if (!StringUtils.isEmpty(content)) {
                    numStr[CCCn++] = String.valueOf(i);
                }
            }
            return numStr;
        }
        return null;
    }

重写后

    private String[] get(Map<String, String> pM) {
        int rrLen = 0;

        Boolean b = false;
        String[] numStr = null;

        Function<List, Object> function = (l) -> {
            int rl = (int) l.get(0);
            Boolean flag = (Boolean) l.get(1);
            String[] numS = (String[]) l.get(2);
            
            for (int i = 0; i < CV.InfoBoardNum; i++) {
                String content = pM.get(CV.InfoBoardContent + i);
                if (!StringUtils.isEmpty(content)) {
                    if(flag){numS[rl++] = String.valueOf(i);}
                    else {rl++;}
                }
            }
            if(flag){return rl;}
            else {return numS;}
        };

        List list = new ArrayList();
        list.add(rrLen);
        list.add(b);
        list.add(numStr);
        rrLen = (int) function.apply(list);
        if (rrLen>0){
            list = new ArrayList();
            
            numStr = new String[rrLen];
            int CCCn = 0;
            b = true;
            list.add(CCCn);
            list.add(b);
            list.add(numStr);
            return (String[]) function.apply(list);
        }
        return null;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

斐波那契数列数列相关简化2

看这篇文章前先看一下第一篇文章&#xff1a; 斐波那契数列数列相关简化1_鱼跃鹰飞的博客-CSDN博客 根据第一篇文章总结如下&#xff1a; 如果某个递归&#xff0c;除了初始项之外&#xff0c;具有如下的形式 F(N) C1 * F(N) C2 * F(N-1) … Ck * F(N-k) ( C1…Ck 和k都…

泛微 E-Office文件上传漏洞复现(CVE-2023-2523、CVE-2023-2648)

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件&#xff0c;泛微协同办公产品系列成员之一,实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

科普拓视野,逐梦新未来——人工智能研学工作坊

随着科技的发展&#xff0c;人工智能逐渐成为世界热门技术之一&#xff0c;为更好启发服务对象想象力&#xff0c;增强其创新精神和实践能力&#xff0c;让服务对象深入感受科技的发展与魅力&#xff0c;2023年5月20日&#xff0c;在阳泉市未成年人救助保护中心的支持下&#x…

如何使用WordPress作为文档管理和文件管理

您想使用 WordPress 来管理您的文件和文档吗&#xff1f; 您可能有需要与团队其他成员共享的电子表格、图像和其他文档。通过将这些文件上传到 WordPress&#xff0c;您可以轻松地与其他人协作&#xff0c;或者只是将这些文档放在 WordPress 仪表板上&#xff0c;以便轻松访问…

从菜鸟到专家,网络安全工程师必备证书有哪些?

网络空间的竞争&#xff0c;归根结底是人才的竞争。 在2022年网络安全周上&#xff0c;《网络安全人才实战能力白皮书》正式发布。数据显示&#xff0c;到2027年&#xff0c;我国网络安全人员缺口将达327万&#xff0c;而高校人才培养规模仅为3万/年。 那么&#xff0c;如果你…

8.1.0版本ELK搭建,开启xpack认证机制

8.1.0版本ELK搭建&#xff0c;开启xpack认证机制 部署环境安排下载elk安装包服务器环境配置部署elasticsearch配置认证配置客户端加密的http通信修改elastic配置文件 部署kibana部署logstash部署httpd&#xff0c;filebeat配置kibana页面部署grafana配置grafana连接elastic 部署…

C++中的多态,以及多态的实现、以及实现多态的两个特例。

一、 多态是什么&#xff1f; 通俗点说&#xff0c;就是多种形态。具体点就是不同对象完成某种事情&#xff0c;会产生不一样的状态。 举个例子&#xff1a;就好比&#xff1a;买票的时候&#xff0c;普通人、学生、军人等等&#xff0c;他们买票有不同的结果&#xff0c;普通人…

从零搭建完整python自动化测试框架(UI自动化和接口自动化 )

目录 一、总体框架 二、PO模式、DDT数据驱动、关键字驱动 三、框架技术选择 四、框架运行结果 五、各用例对应的定义方式&#xff08;PO/DDT&#xff09; 六、API接口定义方式 七、测试执行结果 从零开始搭建项目 一、开发环境搭建 二、新建项目 三、基础功能实现 …

前两天面了个腾讯28K来的,让我见识到了测试界的天花板

马上又是一年毕业季了&#xff0c;那么去年那一批毕业的应届生怎么样了&#xff1f; 2022年堪称大学生就业最难的一年&#xff0c;应届毕业生人数是1076万。失业率超50%&#xff01; 但是我观察到一个数据&#xff0c;那就是已经就业的毕业生中&#xff0c;计算机通信等行业最…

数据结构(C语言):一元多项式的操作(链表实现)

一、题目 一元多项式的操作 设有两个一元多项式&#xff1a; p(x)p0p1xp2x2pnxn q(x)q0q1xq2x2qmxm 多项式项的系数为实数&#xff0c;指数为整数&#xff0c;设计实现一元多项式操作的程序&#xff1a; ① 多项式链表建立&#xff1a;以&#xff08;系数&#xff0c;指数…

国内最佳的客服系统Tidio替代品是什么?

许多做跨境电商的企业都知道&#xff0c;Tidio是一款不错的为电子商务量身定制的全渠道客服系统支持工具&#xff0c;但还有其他同样不错的选择。 当前许多同类型产品以迎合欧美客户居多&#xff0c;中国用户使用不惯&#xff1b;免费版体验门槛高&#xff1b;只支持海外支付方…

【链路追踪】「Go语言」OpenTelemetry实现[gin, gRPC, log, gorm, redis]的集成

文章目录 一、OpenTelemetry的前世今生OpenTracingOpenCensus大一统 二、OpenTelemetry快速体验go快速体验OpenTelemetry系统架构尾部采样 三、通过http完成span传输函数中传递span的context 四、自定义inject和extract源码五、gRPC集成自用框架集成&#xff08;无视即可&#…

最强chrome、edge的广告拦截插件

最强chrome、edge的广告拦截插件 对于浏览器的广告是非常烦人的&#xff0c;尤其是使用百度搜索引擎时&#xff0c;总会在右侧出现百度热搜这样的东西&#xff0c;有时不经意间就会被某些热搜吸引。本来想搜索一些内容&#xff0c;结果被热搜等耗费了大量时间。 有很多人推荐…

pytorch基础语法学习:数据预处理transforms模块

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 建议搭配视频食用 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6 系列其他文章传送门&#xff1a; pytorch基础语法学习&#xff1a;数据读取机制Dataloader与Datase…

3D点云数据转为俯瞰图Python实现代码

我主要是参考了英文博客来撰写本篇文章&#xff0c;仅作为个人学习笔记参考使用。 文章目录 一、点云数据二、图像与点云坐标三、创建点云数据的鸟瞰视图3.1 鸟瞰图的相关坐标轴3.2 限制点云数据范围3.3 将点位置映射到像素位置3.4 切换到新的零点3.5 像素值3.6 创建图像矩阵3.…

IOS最新版开通GPT-PLUS方法

前提&#xff0c;美国IP魔法 不多说了 1.拥有一个美区apple id账号 可以买&#xff0c;也可以自己申请 自己申请就打开魔法到apple官网注册&#xff0c;用gmail邮箱&#xff0c;然后地址用美国地址生成器&#xff0c;记得选免税州 2.充值礼品卡 支付宝可以充值礼品卡&…

大模型总是「胡说八道」怎么办?手把手教你如何应对!

随着 ChatGPT 的出现&#xff0c;「AI 幻觉」一词被频繁提及。那么&#xff0c;什么是 AI 幻觉&#xff1f;简单来说&#xff0c;就是大模型在一本正经地胡说八道。 不止 ChatGPT&#xff0c;其他大语言模型也经常如此&#xff0c;究其根本是大语言模型在训练的过程中存在数据偏…

驱动开发-----io模型总结(2023-5-23)

1.非阻塞模型 在我们使用open函数时&#xff0c;将打开的驱动设置为O_NONBLOCK时&#xff0c;当我们用read函数去读取硬件数据时&#xff0c;无论硬件是否有数据&#xff0c;都会往下执行&#xff0c;不会被阻塞在这里 2.阻塞模型 在我们使用open函数时&#xff0c;没有设置…

C++学习之路-变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

斐波那契数列数列相关简化1

斐波那契数列问题介绍&#xff1a; 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xf…