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

devtools/2024/12/22 14:00:12/

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

双冒号用于静态方法

使用方法:将类的静态方法赋值给一个函数式接口,静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就相当于调用静态方法。格式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/devtools/123380.html

相关文章

数学建模算法与应用 第1章 线性规划

第1章 线性规划 线性规划是数学规划领域的重要分支&#xff0c;广泛应用于资源配置、生产计划、物流管理等领域。它主要用于解决如何在满足一定约束条件下&#xff0c;使目标函数&#xff08;如成本、利润等&#xff09;达到最大或最小的问题。第一章将介绍线性规划的基本概念…

与AI相结合,电梯节能,未来前景

1、电梯节能&#xff0c;跟AI相结合 电梯节能与人工智能&#xff08;AI&#xff09;相结合&#xff0c;可以通过多种方式提高电梯的能效和运行效率。以下是几种可能的结合方式&#xff1a; 模式详情智能调度系统 利用AI算法分析电梯的使用模式&#xff0c;优化电梯的调度…

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…

vscode配置golang

1.安装golang解释器 从网址https://go.dev/dl/下载对应的golang解释器 2.配置环境 Extensions中搜索安装go 2.配置settings.json {"go.autocompleteUnimportedPackages": true,"go.gocodeAutoBuild": false,"explorer.confirmPasteNative"…

案例-任务清单

文章目录 效果展示初始化面演示画面 代码区 效果展示 初始化面 演示画面 任务清单 代码区 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

gitSVN提交规范

commit message subject &#xff1a; 空格 message 主体 例如&#xff1a; feat&#xff1a;增加用户注册功能 常见的 subject 种类以及含义如下&#xff1a; feat: 新功能&#xff08;feature&#xff09; 用于提交新功能。 例如&#xff1a;feat: 增加用户注册功能 f…

unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题分析二、解决方法1. 添加项目设置碰撞检测通道2.玩家角色碰撞设置3.怪物角色碰撞预设 最终效果 前言 在使用unreal engine5制作动作类游戏时&#xff0c;我们使用刀剑等武器攻击怪物或敌方单位时&#xff0c;发现攻击特效…

PHP反射

文章目录 介绍基本用法基本的反射示例1. 反射类2. 反射方法3. 反射属性4.反射全局函数5.反射函数的参数 优势和注意事项优势&#xff1a;注意事项&#xff1a; 介绍 PHP反射是一种强大的机制&#xff0c;允许在运行时检查类、接口、方法、属性等的结构和元数据。它可以用于许多…