Java中双冒号“::”到底什么意思

news2024/11/17 17:50:27

今天给大家分享一个JDK8中的新特性双冒号:”::“,双冒号“::”就是 Java 中的方法引用,是Java 8中的Lambda表达式写法之一,一种执行方法的方法。
在一定程度上简化了我们Java开发的冗余代码。

双冒号(::)使用场景一般有如下6种:

类型引用语法案例
引用静态方法类名::静态方法名Integer::parseInt
引用特定对象实例方法对象::静态方法名System.out::println
引用特定类型的任意对象的实例方法特定类型::实例方法名String::compareToIgnoreCase
引用超类(父类)的实例方法supre::方法名supre::fun
引用类构造方法类名::newArrayList::new
引用数组构造方法数组类型[]::newString[]::new

上面的内容太过于官方,下面我们简单看两个小例子:

1. Lambda表达式表达式:
person -> person.getName();
可以替换成:
Person::getName

2. Lambda表达式表达式:
() -> new HashMap<>();
可以替换成:
HashMap::new

在实际的开发中,我们可能还会遇到很多使用双冒号调用方法的操作

public class Test07 {
    public static void a(){
        System.out.printf("a1");
    }
    public static void a(String s){
        System.out.printf(s);
    }
    public static void main(String[] args) {
        Runnable runnable=Test07::a;
        runnable.run();
    }
}

这个时候大家能看出调用的是一个a方法吗,我们直接运行一下看一下结果:
在这里插入图片描述

说明Runnable对应的是无参的方法a,这是为什么呢?

原因就在于Runnable,追踪到它的原码不难发现它是一个函数式的接口
在这里插入图片描述

里面只有一个无参的run方法,这个方法对应到Runnable runnable=Test07::a就是无参的方法a
如果我们想要使用有参的方法a,那么该使用什么呢?

public class Test07 {
    public static void a() {
        System.out.printf("a1");
    }

    public static void a(String s) {
        System.out.printf(s);
    }

    public static void main(String[] args) {
        Consumer<String> consumer=Test07::a;
        consumer.accept("调用有参的方法a");
    }
}

在这里插入图片描述

通过其源码也可以发现,Consumer也是一个函数式接口,里面提供了一个有参的accept方法,这个方法对应到Test07::a就是有参的方法a,执行之后,可以看到结果如下:
在这里插入图片描述

看到这儿大家应该对什么是方法引用有了一些认知,其本质就是Runnable或Consumer来指向一个具体的方法,至于该使用哪一个就要看指向的方法是否有参数

可能有人就会有疑虑,因为我们Consumer的accept只能接收一个方法,那么所引用的方法也就只能对应一个参数,如果是多个参数怎么办,像下面的方法:

    public static void a(String s1,String s2) {
        System.out.printf(s1+s2);
    }

JDK内置了很多默认的函数式接口,比如BiConsumer

    public static void main(String[] args) {
        BiConsumer<String,String> biConsumer=Test07::a;
        biConsumer.accept("测试","数据");
    }

在这里插入图片描述

可以看到它可以接收两个参数,如果参数大于等于两个,建议将参数封装为一个对象,通过对象去传参

上面的内容均是无返回结果的,因为不管是Runnable的run方法还是Consumer的accept方法,均无返回值,如果我们需要返回值则可以使用Callable
在这里插入图片描述

通过源码不难发现Callable也是一个函数式接口,里面提供了一个无参的call方法,并且提供了返回值

public class Test07 {
    public static String b(){
        return "b";
    }
    public static void main(String[] args) throws Exception {
        Callable<String> runnable=Test07::b;
        String s=runnable.call();
        System.out.printf(s);
    }
}

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

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

相关文章

物流仓储RFID系统设计案例分享

一、项目背景 为了实现仓储货物管理数字化转型的目标&#xff0c;提升仓储业务自动化和数字化水平&#xff0c;在满足仓储日常需求的基础上&#xff0c;验证物联网和人工智能相关技术能力&#xff0c;为仓储业务的柔性自动化、快速部署和复制提供储备能力。 项目设计目标包括…

c++视觉ROI 区域和ROI 区域图像叠加

ROI 区域提取和ROI 区域图像叠加 ROI 区域提取 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the image." …

hadoop集群安装并配置

文章目录 1.安装JDK 环境2.系统配置2.1修改本地hosts文件2.2创建hadoop 用户2.2 设置ssh免密&#xff08;使用hadoop 用户生成&#xff09; 3.安装 hadoop 3.2.43.1 安装hadoop3.1.1 配置Hadoop 环境变量 3.2配置 HDFS3.2.1 配置 workers 文件3.2.2 配置hadoop-env.sh3.2.3 配置…

【数字化转型】10大数字化转型能力成熟度模型01(IOMM)

一、前言 数字化转型是数据化能力建设的目标和价值&#xff0c;作为一个新兴的课题&#xff0c;目前为止并未出现一个统一的数字化转型成熟度模型。不同的企业和机构&#xff0c;根据自身的发展和认知&#xff0c;推出了自己的企业级或者准行业级标准。这些标准具有很强的参考意…

一本没有任何数学公式的自然语言处理入门书

ChatGPT 时代来了&#xff0c;AI 从旧时王谢堂前燕&#xff0c;飞入寻常百姓家。越来越多非 AI 领域 的软件开发者涌进 NLP(自然语言处理)领域。在这个快速发展的时代&#xff0c;如果这些软件开发 者要像读书那样先读 4 年本科、2 年硕士、3 年博士才能搞 AI&#xff0c;风口早…

Python:温度转换(摄氏度与华氏度)

Python:温度转换&#xff08;摄氏度与华氏度&#xff09; TempStrinput("请输入带有符号的温度值&#xff1a;") if TempStr[-1] in [F,f]:C(eval(TempStr[0:-1])-32)/1.8print("转换后的温度是{:.2f}C".format(C)) elif TempStr[-1] in[C,c]:F1.8*eval(T…

在Android中实现动态应用图标

在Android中实现动态应用图标 你可能已经遇到过那些能够完成一个神奇的技巧的应用程序——在你的生日时改变他们的应用图标&#xff0c;然后无缝切换回常规图标。这是一种引发你好奇心的功能&#xff0c;让你想知道&#xff0c;“他们到底是如何做到的&#xff1f;”。嗯&…

【EI会议征稿】第三届智慧交通、能源与动力国际学术会议(STEP 2023)

第三届智慧交通、能源与动力国际学术会议&#xff08;STEP 2023&#xff09; 2023 3rd International Conference on Smart Transportation, Energy and Power 第三届智慧交通、能源与动力国际学术会议 (STEP 2023) 将于2023年12月15-17日在中国三亚市隆重举行&#xff0c;会议…

使用vite+npm封装组件库并发布到npm仓库

组件库背景&#xff1a;使用elementplusvue封装了一个通过表单组件。通过JSX对el-form下的el-input和el-button等表单进行统一封装&#xff0c;最后达到&#xff0c;通过数据即可一键生成页面表单的功能。 1.使用vite创建vue项目 npm create vitelatest elementplus-auto-form…

Linux基础工具

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

【轻松玩转MacOS】基本操作篇

引言 本文是系列的开篇&#xff0c;我将为大家介绍MacOS的基本操作。对于初次接触MacOS的用户来说&#xff0c;掌握这些基本操作是必不可少的。无论是启动和关机&#xff0c;还是使用键盘和鼠标&#xff0c;或者是快捷键的使用&#xff0c;这些基本操作都是你开始使用MacOS的第…

三星发布 Galaxy SmartTag 2

三星近日发布了一款新品 —— Galaxy SmartTag 2 追踪器&#xff0c;该款产品采用了全新的椭圆设计以取代上代 SmartTag 的菱形设计&#xff0c;这款的钥匙孔也比上代更大&#xff0c;并采用了金属圆环以防止磨损。 这款产品有黑、白2种颜色可供选择&#xff0c;支持 IP67 级防…

网络原理 - 详解

一&#xff0c;网络通信基础 1.1 IP地址 描述一个设备在网络上的地址&#xff0c;一般使用4个0~255之间的数字&#xff0c;并且使用三给 . 进行分割&#xff0c;如&#xff1a;127.0.0.0 1.2 端口号 端口号是一个2个字节的整数&#xff0c;用来区分一个主机上的不同应用程序…

全面解析HTTP协议

当谈到网络通信和Web开发时&#xff0c;HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一个非常重要的协议&#xff0c;它是用于在Web浏览器和服务器之间传输数据的基础协议。 什么是HTTP协议&#xff1f; HTTP是一种应用层协议&#xff0c;用于在客户端和服务器…

吸烟检测Y8N,支持C++,PYTHON,ANDROID

吸烟检测Y8N&#xff0c;支持C,PYTHON,ANDROID 现在&#xff0c;深度学习已经非常流行&#xff0c;最新出来的YOLOV8&#xff0c;更是将精度和速度达到极限。训练一个目标很简单&#xff0c;首先&#xff0c;标记图片&#xff1b;然后训练得到PT模型&#xff1b;最后转换成ONNX…

烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控平台给出答案

由于烟花爆竹具有易燃易爆风险&#xff0c;稍有不慎就会发生严重事故&#xff0c;而烟花爆竹厂区作为大量烟花爆竹存放地点&#xff0c;厂区面积大、工作人员杂乱&#xff0c;甚至有很多厂区原料存放不当&#xff0c;给日常的安全管理带来极大的压力&#xff0c;利用信息化手段…

掌动智能:性能压力测试的重要性

采用性能压力测试可以帮助企业预估系统容量、提升用户体验以及降低风险和成本。在软件开发过程中&#xff0c;将性能压力测试纳入测试策略的重要一环&#xff0c;将为企业的成功和用户满意度打下坚实的基础。 性能压力测试的重要性&#xff1a; 一、发现性能瓶颈 性能压力测试能…

【Linux】信号屏蔽与信号捕捉的原理与实现(附图解与代码)

这一篇的篇幅可能有点长&#xff0c;如果已经了解了以下两个知识点的同学可以自行跳到第三部分——信号屏蔽的实现。 不太了解的同学希望你们能够静下心来看完&#xff0c;相信一定会有不小的收获。那么话不多说&#xff0c;我们这就开始啦&#xff01;&#xff01;&#xff0…

企业防止泄密,应该做到哪些?(防止数据泄露的方法有哪些)

随着信息化时代的快速发展&#xff0c;信息泄露问题越来越普遍。一个数据泄露事件就可能导致企业巨额损失&#xff0c;甚至影响用户的安全和隐私。因此&#xff0c;如何防止失泄密问题的发生是企业和个人都需要重视的事情。下面介绍一些具体的方法和措施来防止失泄密问题发生。…

FR问题记录

1. 问题&#xff1a;下拉框搜索查询时&#xff0c;出现所有的搜索信息 解决方法&#xff1a;使用数据集sql进行数据筛选 在数据库查询中使用where条件筛选&#xff0c;如 ${IF(LEN(所属省份) 0,"","AND province in (" 所属省份 ")")}参考…