java8 双冒号(::)使用方法

news2024/10/9 1:45:12

双冒号(::)运算符是跟函数式接口相关的运算符,作为函数式接口的赋值操作。

双冒号用于静态方法

使用方法:将类的静态方法赋值给一个函数式接口,静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就相当于调用静态方法。格式ClassName::MethodName

自定义一个函数式接口如下:

@FunctionalInterface
public interface FuncInterfaceDemo<T, F>{
    void accept(T t, F f);
}

测试静态方法赋值给函数式接口

public class ColonTestDemo {
    private String name;
 
    public ColonTestDemo(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public static void run(ColonTestDemo t, String f) {
        System.out.println(t.getName() + " said: '" + f+ "'");
    }
 
    public static void main(String[] args) {
        //测试静态方法
        ColonTestDemo staticTest = new ColonTestDemo("StaticMethod");
        FuncInterfaceDemo<ColonTestDemo, String>  staticFunc = ColonTestDemo::run;
        staticFunc.accept(staticTest, "I am a static method");
    }
}

运行结果如下,相当于调用ColonTestDemo.run(staticTest, “I am a static method”):
在这里插入图片描述

双冒号用于构造方法

使用方法:将类的构造方法赋值给一个函数式接口,构造方法的参数个数、类型要跟函数式的接口一致,跟静态方法类似。调用这个函数式接口创建对象。格式ClassName::new

测试构造函数赋值给函数式接口如下:

public class ColonTestDemo {
    private String name;
 
    private String desc;
 
    public ColonTestDemo(String name, String desc) {
        this.name = name;
        this.desc = desc;
        System.out.println(this.getName() + " said: '" + this.getDesc() + "'");
    }
 
    public String getName() {
        return name;
    }
 
    public String getDesc() {
        return desc;
    }
    
    public static void main(String[] args) {
        //测试构造方法
        FuncInterfaceDemo<String, String> newFunc = ColonTestDemo::new;
        newFunc.accept("Constructor", "I am a constructor method");
    }
 
}

运行结果如下,相当于调用 new ColonTestDemo(“Constructor”, “I am a constructor method”):
在这里插入图片描述

双冒号用于成员方法

使用方法:将类的成员方法赋值给一个函数式接口,成员方法的参数个数要比函数式的接口少1个,因为对象本身作为第一个参数传给函数式接口。调用这个函数式接口相当于执行对象的成员方法。格式ClassName::MethodName

public class ColonTestDemo {
    private String name;
 
    public ColonTestDemo(String name) {
        this.name = name;
    }
 
    public void run(String f) {
        System.out.println(name + " said: '" + f + "'");
    }
 
    public static void main(String[] args) {
        //测试成员方法
        ColonTestDemo instTest = new ColonTestDemo("InstMethod");
        FuncInterfaceDemo<ColonTestDemo, String> instFun = ColonTestDemo::run;
        instFun.accept(instTest, "I am a inst method");
    }
}

运行结果如下,相当于调用instTest.run(“I am a inst method”):
在这里插入图片描述
如果成员方法参数个数跟接口一致(不是少1个),编译报错"Non-static method cannot be referenced from a static context"。因为编译器认为需要一个静态方法来匹配,但实际不是一个静态方法。
或者赋值时使用对象的冒号方法:colonTestDemo::run,参数就可以和接口数一致。

public class ColonTestDemo {
    private String name;
 
    public ColonTestDemo(String name) {
        this.name = name;
    }
 
    public void run(String t, String f) {
        System.out.println(name + " said: '" + f + "'");
    }
 
    public static void main(String[] args) {
        //测试成员方法
        ColonTestDemo instTest = new ColonTestDemo("InstMethod");
        FuncInterfaceDemo<String, String> instFun = ColonTestDemo::run;
        // 或者用实例的run方法即可,则不会出现下图的错误。
        FuncInterfaceDemo<String, String> instFun = instTest::run;
    }
}

在这里插入图片描述

如果函数式接口第一个参数类型不是对象的类型,也编译报错"类型不兼容"。因为第一个实参是对象的类型,而函数式接口的第一个形参不是对象的类型。

public class ColonTestDemo {
    private String name;
 
    public ColonTestDemo(String name) {
        this.name = name;
    }
 
    public void run(String f) {
        System.out.println(name + " said: '" + f + "'");
    }
 
    public static void main(String[] args) {
        //测试成员方法
        ColonTestDemo instTest = new ColonTestDemo("InstMethod");
        FuncInterfaceDemo<String, ColonTestDemo> instFun = ColonTestDemo::run;
    }
}

在这里插入图片描述

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

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

相关文章

数字化转型:别让技术迷了眼,战略觉醒才是关键。新媒体营销大客户销售AIGC大模型创新思维专家培训讲师谈数字化转型商业模式短视频内容社私域数字经济人工智能

​数字化转型从根本上讲不是关于技术,而是关于战略。 数字化转型使用新的数字技术来实现重大的业务改进,如增强客户体验、精简运营或创建新的商业模式。数字化转型描述了一家公司试图为数字时代做好准备的旅程。 数字化转型不是关于技术或获取新的技术技能。事实上,它是关于获得…

永磁同步电机环路反步法(backstepping)控制

文章目录 1、反步控制原理1.1 李雅普诺夫稳定性定理1.2 严格反馈系统1.3 一般设计流程 2、永磁同步电机反步控制2.1 反步控制器设计2.2 反步控制仿真 参考 写在前面&#xff1a;本人能力、时间、技术有限&#xff0c;没有对一些细节进行深入研究和分析&#xff0c;也难免有不足…

简易CPU设计入门:取指令(四)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…

SOMEIP_ETS_174: SD_Unknown_Option_type

测试目的&#xff1a; 验证DUT能够拒绝一个引用了未知选项类型的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个引用了未知选项类型的SubscribeEventgroup消息时&#xff0…

Solidedge二次开发(C#)-将dft文件转换为dwg格式文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在Solid Edge中创建一个par文件3、通过二次开发将dft转换为dwg4、结果显示1、前言 Solid Edge提供了将dft转换为dwg的接口,也即是保存功能。有时在不显示Solid Edge界面的情况下,将其…

【C语言刷力扣】1436.旅行终点站

题目&#xff1a; 解题思路&#xff1a; 两层循环查找&#xff0c;第一次循环中初始化 destination 为 path中每次旅行的终点作为最终的终点。二次循环查找当前 destination &#xff0c;若是作为某次旅行的起点&#xff0c;说明不是最后的终点。 char* destCity(char ***paths…

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制

目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包&#xff0c;如何分用 分离有效载荷 隐含问题&#xff1a;TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…

多功能快捷回复软件

各位亲爱的客服宝宝们&#xff0c;每天面对大量的客户咨询&#xff0c;您是否还在手动一个一个地打字回复呢&#xff1f;别担心&#xff0c;我们为您带来了一款多功能快捷回复软件——客服宝。有了它&#xff0c;您的工作将变得无比轻松&#xff01; 客服宝是一款集成了内容存储…

网络编程(14)——基于单例模板实现的逻辑层

十四、day14 今天学习如何通过单例模板实现逻辑层 1. 利用C11特性封装单例模板 和上一节设计的单例模板有些不同&#xff0c;本节设计的单例模板利用了以下四个C11新特性&#xff0c;优化了代码 unique_lock和lock_guard once_flag和call_once std::function condition_v…

1打家劫舍三部曲

刷题刷题找工作&#xff01; s198.打家劫舍 动态规划&#xff1a;开始打家劫舍&#xff01; dp数组表示到第i家的最高金额 dp递归公式&#xff0c;要么抢劫这家&#xff0c;加上i-2所抢的钱&#xff0c;要么不抢&#xff0c;保留上一家的。 …

linux中的火墙优化策略

1.火墙介绍 1. netfilter 2. iptables 3. iptables | firewalld 2.火墙管理工具切换 在rocky9 中默认使用的是 firewalld firewalld -----> iptables dnf install iptables - services - y systemctl stop firewalld systemctl disable firewalld systemctl mask fi…

Vue3 使用 pinia

什么是Pinia Pinia是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态&#xff0c;与vuex功能一样。 准备 安装 npm install pinia 或者 yarn add pinia使用 首先修改main.ts文件 main.ts import ./assets/main.cssimport { createApp } from vue import App from…

HTB:Tactics[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which Nmap switch can we use to enumerate machines when our ping ICMP packets are blocked by the Windows firewall? 2.What does the 3-letter acronym SMB stand for? 3.What port does SMB use to operate at? 4.What comma…

Comfyui segmentAnythingUltra V2报错

&#x1f385;问题表现及解决方案 Comfyui segmentAnythingUltra V2报错&#xff0c;找不到VITMatte模型&#xff0c;这个报错报的比较模糊&#xff0c;所以花了一点时间找模型。 简单来说&#xff0c;到huggingface上&#xff1a; https://huggingface.co/hustvl/vitmatte-s…

麒麟系统串口配置篇

麒麟系统串口配置篇 1.配置串口驱动&#xff08;编译/动态加载串口&#xff09; 解压文件夹,然后在解压后的文件夹所在目录&#xff0c;右键选择打开终端&#xff0c;依次执行以下命令&#xff1a; 以麒麟系统下的CH341串口驱动为例&#xff0c;解压CH341SER_LINUX.zip sudo…

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂 在上一篇文章中&#xff0c;主要是对网关进行了一个总体的介绍&#xff0c;然后对网关中的断言进行了一个描述。在这篇文章中&#xff0c;主要是对网关中的最后一大核心——过滤进行介绍。 当客户端发送过来的请求经过断言之后&#xff0c;如果还想在请求前后添…

如何在 MySQL 中处理 BLOB 和 CLOB 数据类型

在 MySQL 数据库中&#xff0c;BLOB&#xff08;Binary Large Object&#xff09;和 CLOB&#xff08;Character Large Object&#xff09;数据类型用于存储大量的二进制数据和字符数据。本篇文章我们来一起看看如何在 MySQL 中处理 BLOB 和 CLOB 数据类型&#xff0c;并加入如…

7.3美团—Java日常实习面经

7.2晚上投的&#xff0c;发邮件约到了7.3晚上 总时长1小时10分钟左右 自我介绍 拷打项目30min 缓存三兄弟 Redis除了缓存&#xff0c;还能做什么 Redis的数据结构&#xff0c;什么时候用哈希&#xff0c;什么时候用字符串 线程池的执行流程 MySQL索引的数据结构 聚簇索引…

基于PHP+uniapp微信小程序的个性化影视推荐系统的设计54lfb

目录 项目介绍技术栈和环境说明具体实现截图php技术介绍文件解析微信开发者工具HBuilderXuniapp开发技术简介解决的思路性能/安全/负载方面数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 项目介绍 首先要进行需求分析&#xff0c;分析出电影信…

JUC高并发编程7:辅助类

1 减少计数CountDownLatch 1.1 CountDownLatch 概述 CountDownLatch 是 Java 并发包&#xff08;java.util.concurrent&#xff09;中的一个同步工具类&#xff0c;用于在多个线程之间进行协调。它允许一个或多个线程等待其他线程完成一组操作。 1.1.1 主要方法 CountDownL…