Kotlin中的::操作符详解

article/2025/8/24 9:20:25

Kotlin提供了::操作符,用于创建对类或对象的成员(函数、属性)的引用。这种机制叫做成员引用(Member Reference)。这是Kotlin高阶函数和函数式编程的重要组成部分。

简化函数传递

在Java中,我们这样传方法:

    list.forEach(item -> System.out.println(item));

而在Kotlin中,可以写成:

    val list = listOf("Apple","Banana","Cherry")list.forEach(::println)

::println 表示把 println 当作一个函数对象传进去,而不是调用它,就是一种函数引用。

常见用法分类

1.引用类的成员函数或属性

val length:(String) ->Int = String::length
val toUpperCase:(String) ->String = String::toUpperCase

等价于

val length:(String) -> Int = {it.length
}
val toUpperCase:(String) -> String = {it.toUpperCase()
}

2.引用构造函数

 class Person{
}
val createPerson: () -> Person = ::Person

等价于:

val createPerson: () -> Person = {Person()}

3.引用顶层函数

定义一个函数

fun sayHello(name:String){println("Hello,$name")
}

引用方式

val greet:(String) -> Unit = ::sayHello
fun main() {greet("Tom")
}

4.引用扩展函数

fun String.isLong() = this.length > 10val check:(String) -> Boolean = String::isLong

5.获取类的KClass对象(关键字class)

val clazz = String::class

这里与函数引用的::不同,获取的是类元信息

实际使用场景

作为高阶函数参数

data class User(val name: String)
val users = listOf(User("Alice"),User("Bob"))val names = users.map(User::name)
fun main() {println(names)
}

在这里插入图片描述

绑定实例方法

data class User(val name: String)
val users = User("Mike")
val getName: () -> String = users::namefun main() {println(getName())
}

在这里插入图片描述

底层原理简述

val func = String::lengthfun main(){println(func("Hello"))
}

kotlin编辑器会生成一个实现了相应函数接口的对象

val func = fun(s:String):Int = s.length
等价于
fun myFunction(s: String): Int {return s.length
}

这些引用在编译期就能被识别并优化


http://www.hkcw.cn/article/RZFOGtgvFa.shtml

相关文章

K8S集群主机网络端口不通问题排查

一、环境: k8s: v1.23.6 docker: 20.10.14 问题和故障现象:devops主机集群主机节点到端口8082不通(网络策略已经申请,并且网络策略已经实施完毕),而且网络实施人员再次确认,网络策…

回调函数的理解

int yuxiangrousi 0; // 全局变量:鱼香肉丝(酱油量)// 回调函数:妈妈处理酱油(将酱油加入鱼香肉丝) void mother_callback(int new_jiangyou) {yuxiangrousi new_jiangyou; // 把酱油放进鱼香肉丝 }// 孩…

python字符重复一次 2023年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

python字符重复一次 2023全国青少年信息素养大赛Python编程挑战赛复赛真题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解

【笔记】suna部署之获取 Supabase API key 和 project URL

#工作记录 Supabase | The Open Source Firebase Alternative 一、注册与登录 方式一:GitHub 授权登录 在登录页面选择 “继续使用 GitHub” ,跳转到 GitHub 授权页面(如图 5 所示)。确认 “Supabase 的想要访问您的 [账户名] 帐…

从法律层面剖析危化品证书:两证一证背后的安全逻辑

《安全生产法》第 24 条明确规定,危化品单位主要负责人和安全管理人员 “必须考核合格方可上岗”。这并非仅仅是行政要求,而是通过法律来筑牢安全防线。在某危化品仓库爆炸事故中,由于负责人未持证,导致事故责任升级,企…

MMR搜索和LangChain整合Milvus实战

引言 在现代信息检索系统的构建过程中,搜索策略的选择往往决定了用户体验的质量。相似度搜索与MMR最大边界相关搜索作为两种主流技术方案,各自承担着不同的使命:前者专注于精确匹配,后者致力于平衡相关性与多样性。 本文将通过深入…

C++容器进阶:深入解析unordered_map与unordered_set的前世今生

目录 🚀 引言:现代C容器的王者 🎯 学习路径 第一章:哈希表的数学魔法 1.1 哈希表的基本概念 哈希表的数学模型 1.2 哈希函数的设计艺术 第二章:unordered_map的深度解析 2.1 unordered_map的设计哲学 2.2 uno…

TDengine 运维——巡检工具(安装前检查)

简介 本文档旨在介绍 TDengine 安装部署前后配套的巡检工具。 相关工具的功能简介: 工具名称功能简介安装前检查部署前对 TDengine 安装部署的依赖要素进行安装前检查安装前预配置部署前对 TDengine 安装部署的依赖要素进行安装前预配置安装部署指定环境安装部署…

两个频率比较接近的简谐振动叠加后会产生拍形

两个频率比较接近的简谐振动叠加后会产生拍形。 import numpy as np import matplotlib.pyplot as plt# Parameters f1 10.0 # Frequency of the first vibration (Hz) f2 10.5 # Frequency of the second vibration (Hz) t_max 10 # Time range (seconds) t np.linsp…

安科瑞Acrelcloud-6200系统:智慧路灯安全用电监控平台架构解析

安科瑞顾强———Acrelgq 智慧路灯作为智慧城市与新基建的核心载体,集成了大量异元异构电子设备,其供电安全与能效管理面临电压多样、权属分散、扩展性不足等挑战。本文提出一种融合统一供电、分路计量、智能防护与远程监控的解决方案,通过构…

706万彩票大奖无人认领 兑奖期限已过

706万彩票大奖无人认领 兑奖期限已过!5月7日,广东东莞福彩官微发布了一篇寻找东莞706万大奖得主的文章。然而20多天过去了,大奖得主仍未现身兑奖。5月29日下午,东莞市福彩发行中心表示,如果当天未见得主前来领奖,将视为弃奖处理,奖金将用于扶老、助残等公益事业。据报道…

Scratch节日 | 拯救屈原 | 端午节

端午节快乐! 这款特别为端午节打造的Scratch游戏 《拯救屈原》,将带你走进古代中国,感受历史与文化的魅力! 🏮 游戏介绍 扮演勇敢的探险者,穿越时空回到古代,解锁谜题,完成任务&…

上海一款罕见肿瘤靶向药获批 填补治疗空白

上海一款罕见肿瘤靶向药获批 填补治疗空白。国家药品监督管理局通过优先审评审批程序批准了上海复星医药产业发展有限公司申报的1类创新药芦沃美替尼片(商品名:复迈宁)。这是上海今年第6款获批上市的国产1类创新药,也是近期又一款获批上市的罕见病用药。复迈宁本次获批的两…

【开发技巧指北】IDEA修改默认绑定Maven的仓库地址

【开发技巧指北】IDEA修改默认绑定Maven的仓库地址 Microsoft Windows 11 家庭中文版 IIntelliJ IDEA 2025.1.1.1 默认的IDEA是有自己捆绑的Maven的(这是修改完毕的截图) 修改默认的Maven配置,路径是IDEA安装路径下的plugins D:\Softwares\I…

小程序为什么要安装SSL安全证书

小程序需要部署SSL安全证书,这是小程序开发及运营的强制性要求,也是保障用户数据安全、提升用户体验和满足平台规范的必要措施。 一、平台强制要求 微信小程序官方规范 微信小程序明确要求所有网络请求必须通过HTTPS协议传输,服务器域名需配…

Nest全栈到失业(三):半小时图书管理系统-User

用户模块 创建用户 先使用nest g resource user --no-spec 创建一个用户的模块,并选择他的CRUD操作 写一个注册接口 import { Controller, Post, Body } from nestjs/common; import { UserService } from ./user.service; import { RegisterUserDto } from ./dto/register-us…

美创专家分享医疗数据安全分类分级实践与探索

医疗数据安全分类分级 近日,由浙江卫生信息学会主办的2025年卫生健康网络数据安全培训会(宁波站)顺利举办,美创科技专家许钰钢受邀分享《医疗数据安全分类分级实践与探索》,系统解析医疗行业数据安全分类分级的实施必…

Vision Transformer网络结构

0.前言 参考CSDN大佬(太阳花的小绿豆)的代码,梳理了一下vit的网络结构,代码地址如下: deep-learning-for-image-processing/pytorch_classification/vision_transformer at master WZMIAOMIAO/deep-learning-for-image-processing GitHub …

start-local:一键本地启动 Elasticsearch 和 Kibana

start-local:一键本地启动 Elasticsearch 和 Kibana start-local Try Elasticsearch and Kibana locally 项目地址: https://gitcode.com/gh_mirrors/st/start-local 项目介绍 start-local 是一个开源项目,它通过一个简单的 shell 脚本&#xff…

time-ghc-modules:快速定位Haskell编译性能瓶颈

time-ghc-modules:快速定位Haskell编译性能瓶颈 time-ghc-modules Analyze GHC .dump-timings files 项目地址: https://gitcode.com/gh_mirrors/ti/time-ghc-modules 项目介绍 在现代软件开发中,性能优化始终是一个核心话题。特别是对于使用Has…