函数式接口入门简介(存在疑问,求解答)

news2025/1/11 1:40:54

这里写目录标题

  • 引子
  • 四种函数式接口-简单Demo
  • 四种函数式接口介绍
  • 函数式接口实战-代码对比
  • 关于Consumer赋值问题(疑问,求解答)

引子

  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;
    }

关于Consumer赋值问题(疑问,求解答)

        Integer ss = 0;
        Consumer consumer1 = s -> {
            s = (Integer) s + 1;
            System.out.println("ss" + s);
        };
        System.out.println("最后结果1: "+ss);
        consumer1.accept(ss);
        System.out.println("最后结果2: "+ss);

        System.out.println("-------------------");


这里我一开始以为是包装类型和基本类型问题,我一开始测试的是int类型,后面发现Integer也无法成功,
所以又 测试了个JAVABEAN
在这里插入图片描述
再对比下另一个

        List list1 = new ArrayList();
        list1.add(1);
        list1.add("king");
        BiConsumer<List<Object>,Student> consumer = (List<Object> list, Student d) -> {
            d.setId((int) list.get(0));
            d.setName((String) list.get(1));
        };
        Student student = new Student();
        System.out.println(student);
        consumer.accept(list1, student);
        System.out.println(student);
        System.out.println("-------------------");

在这里插入图片描述

        System.out.println("-------------------");


        Student student1 = new Student();

        Consumer consumer2 = s -> {
            student1.setId(2);
            
            System.out.println("ss" + s);
        };
        System.out.println("最后结果1: "+student1);
        consumer2.accept(ss);
        System.out.println("最后结果2: "+student1);

在这里插入图片描述
但是我

System.out.println("-------------------");


        AtomicReference<Integer> ss = new AtomicReference<>(0);
        ss.set(0);
        Consumer consumer3 = s -> {
            ss.set(1);
//            System.out.println("ss" + s);
        };
        consumer3.accept(ss);
        System.out.println(ss);

在这里插入图片描述
在这里插入图片描述
其实consumer实现了一个内部操作功能,但是对于Bean类型赋值,是成功的,但是对于int、Integer类型赋值,只会在内部实现,外界得不到操作后的结果。
这是我的疑惑吧

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

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

相关文章

【JS】1691- 重学 JavaScript API - Performance API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API ❞ &#x1f3dd; 1. 什么是 Performance API 1.1 概念介绍 Performance API 提供了「访问和测量浏览器性能相关信息」的方法。…

作为IT行业过来人,我有4个重要建议给年轻程序员!

见字如面&#xff0c;我是军哥&#xff01; 作为一名 40 岁的 IT 老兵&#xff0c;我在年轻时踩了不少坑&#xff0c;至少有两打&#xff0c;我总结了其中最重要的 4 个并一次性分享给你&#xff0c;文章不长&#xff0c;你一定要看完哈&#xff5e; 1、重视基础还不够&#xf…

OpenAI Whisper + FFmpeg + TTS:动态实现跨语言视频音频翻译

本文作者系360奇舞团前端开发工程师 摘要&#xff1a; 本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS&#xff08;Text-to-Speech&#xff09;技术&#xff0c;以实现将视频翻译为其他语言并更换声音的过程。我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译&#x…

软件设计师 操作系统涉及题目

做题技巧 看有几个箭头就是有几个信号量。比如四个箭头就是S1 S2 S3 4把对应的信号量从小到大顺序放在对应箭头 比如P1-》P2就是 12 P1-》P3就是13 所以13大 注意是先V(S) 再P(S)&#xff0c;箭头前是v后是p **P1没有前驱&#xff0c;第一个执行的进程.执行前用P操作 执行后用…

媒体传输协议的演进与未来

音视频应用近年来呈现出迅猛的发展趋势&#xff0c;成为互联网流量的主要载体&#xff0c;其玩法丰富&#xff0c;形态多样&#xff0c;众多繁杂的媒体传输协议也应运而生。LiveVideoStackCon 2022北京站邀请到快手传输算法负责人周超&#xff0c;结合快手在媒体传输上的优化与…

官宣!首个大模型兴趣小组开放申请,专注大模型应用落地

‍‍ 这里汇聚着大模型开发者与应用者 这是一个小而美小而精的兴趣组织 这是一个更关注大模型行业实际落地的组织 飞桨 AI Studio 大模型领域兴趣小组关注文心一言等大模型与开源模型应用落地&#xff0c;跟进最新技术趋势与应用方向&#xff0c;共同拓展技术视野、找寻商业化机…

QSS QTableWidget样式设置

QTableWidget的样式分为几个部分&#xff1a; 分别是&#xff1a; 外框&#xff1a;QTableWidget 表头&#xff1a;QHeaderView 表头字段&#xff1a;QHeaderView::section 表格&#xff1a;QTableWidget::item 选中的表格&#xff1a;QTableWidget::item::selected 水平滚动条…

chatgpt赋能Python-python_pensize

Python Pensize: How to Adjust Your Pen Size in Python If you’re new to Python, you might be struggling to master the art of the pen. Thankfully, Python Pensize is here to help. In this article, we’ll discuss how to adjust your pen size in Python so you …

快手广告怎么顺利度过冷启动期?

快手广告经常会出现这样的问题&#xff0c;投放初期新广告主、新产品、新账户都很难拿到曝光&#xff0c;没法突破&#xff1b;今天给大家介绍下什么是冷启动&#xff0c;如何快速有效的度过冷启动期。 冷启动就是刚开始启动的时候没有基础&#xff0c;模型需要根据历史情况来预…

Linux 查看或统计网卡流量的几种方式么?

在工作中&#xff0c;我们经常需要查看服务器的实时网卡流量。通常&#xff0c;我们会通过这几种方式查看Linux服务器的实时网卡流量。 目录 1、sar 2、 /proc/net/dev 3、ifstat 4、iftop 5、nload 6、iptraf-ng 7、nethogs 8、扩展 1、sar sar命令包含在sysstat工具…

大Op和小op的含义及理解

大Op和小op的含义及理解 Stochastic order notation(随机有序符号)6.1.1 O p O_p Op​和 o p o_p op​之间的关系6.2 符号速记及其算数性质6.3 为什么 o p o_p op​和 O p O_p Op​符号很有用&#xff1f;6.4例子&#xff1a;均值估计的相合性参考&#xff1a; Stochastic orde…

基于大模型GPT,如何提炼出优质的Prompt

基于大模型实现优质Prompt开发 1. 引言1.1 大规模预训练模型 2. Prompt开发2.1 Prompt基本定义&#xff1a;2.2 为什么优质Prompt才能生成优质的内容2.3 如何定义优质的Prompt 3. Prompt优化技巧3.1 迭代法3.1.1 创作评估3.1.2 基础创作3.1.3 多轮次交互 3.2 Trick法3.2.1 戴高…

【MySQL入门实战4】-发行版本及安装概述

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

python+django基于爬虫系统的世界历史时间轴历史事件大事记6ouj9

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

chatgpt赋能Python-python_pyuserinput

介绍 Python是一种极其流行的编程语言&#xff0c;可以用于多种任务&#xff0c;例如数据分析、机器学习、Web开发等等。 Python社区非常活跃&#xff0c;因此有许多模块和库可以用于各种任务&#xff0c;包括用户输入和自动化。 PyUserInput是一个Python库&#xff0c;它提供…

C#,码海拾贝(22)——线性方程组求解的全选主元高斯-约当消去法之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> …

小航编程题库机器人等级考试理论一级(2022年9月) (含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题2.0分 删除编辑 答案:C 第1题使用下列工具不能省力的是&#xff1f;&#xff08; &#xff09; A、斜面B、动滑轮C、定滑轮D…

深度学习笔记之循环神经网络(五)循环神经网络的反向传播过程

深度学习笔记之循环神经网络——循环神经网络的反向传播过程 引言回顾&#xff1a;循环神经网络的前馈计算过程场景构建前馈计算描述 反向传播过程各参数的梯度计算各时刻损失函数梯度计算损失函数对各时刻神经元输出的梯度计算 Softmax \text{Softmax} Softmax回归的梯度计算关…

chatgpt赋能Python-python_pyzmq

Python和pyzmq&#xff1a;高效的分布式计算 Python是一种高级的、面向对象的编程语言&#xff0c;因其易学易用以及可扩展性而备受青睐。其中&#xff0c;用于消息传递和异步I/O操作的pyzmq库&#xff0c;使Python成为一个高效的分布式计算平台。 Pyzmq的概述 Pyyzmq是Pyth…

chatgpt赋能Python-python_peak

Python Peak - 程序员必备技能 Python Peak 指的是 Python 的高峰和巅峰。Python 是一种高级编程语言&#xff0c;已成为数据科学和软件开发领域中最流行的语言之一。在 Python Peak 中&#xff0c;程序员能够利用 Python 的最佳实践和工具&#xff0c;最大化地发挥出 Python …