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

news/2024/10/9 2:01:27/

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

双冒号用于静态方法

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

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

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

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

java">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

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

java">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

java">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,参数就可以和接口数一致。

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

在这里插入图片描述

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

java">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.ppmy.cn/news/1536411.html

相关文章

202408第十五届蓝桥杯青少组省赛C++中级组题解

202408第十五届蓝桥杯青少组省赛C++中级组题解 单选题 1、定义 char a[]="hello\nworld",执行 cout<<a,输出结果是(B) A、helloworld B、hello world C、 hellonworld D、 hello\nworld 解析:\n输出时会换行。 2、 的结果是(C)。 A、 B、

滚雪球学Oracle[4.2讲]:PL/SQL基础语法

全文目录&#xff1a; 前言一、PL/SQL基础语法1.1 变量声明变量声明示例&#xff1a; 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表&#xff08;嵌套表&#xff09;嵌套表的定义与使用 3.2 关联数组关联数组…

数据挖掘笔记part one (认识数据挖掘)

定义 从大量的&#xff0c;不完全的&#xff0c;有噪音的&#xff0c;模糊的&#xff0c;随机的数据中提取出存在潜在价值信息和知识的过程。 数据&#xff0c;信息&#xff0c;知识的关系 数据>信息>情报>知识>智慧&#xff08;越小越精炼&#xff0c;越牛&…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分…

深入解析 NoSQL 数据库的分类与特点

目录 NoSQL 数据库概述NoSQL 数据库的主要分类 2.1 键值存储2.2 文档存储2.3 列族存储2.4 图数据库 NoSQL 数据库的特点NoSQL 数据库的应用场景NoSQL 数据库的优缺点总结 NoSQL 数据库概述 NoSQL 数据库是一种非关系型数据库&#xff0c;旨在应对大规模数据存储和处理的挑战…

02_InFluxDb

InFluxDb 初始化初始化流程 交互InFluxDbWebUI交互 数据模型行协议添加标签数据格式 数据类型空格索引 初始化 初始化流程 用户 密码 组织名称 Bucket—mysql里面的数据库概念 交互InFluxDb 暂用了8086端口.提供了 http api WebUI交互 略... 数据模型 这是mysql里面的表…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…

如何在 Kali Linux 上安装 Google Chrome 浏览器

如何在 Kali Linux 上安装 Google Chrome 浏览器 Google Chrome 是最流行的网络浏览器之一&#xff0c;可在许多不同的设备上使用。它也可以在 Kali Linux 上运行&#xff0c;尽管 Mozilla Firefox 是默认的 Web 浏览器并且随发行版预装。 在 Kali 上安装 Google Chrome 非常…