Kotlin学习历程——扩展

Kotlin 一些常用的扩展函数集合.zip Kotlin 一些常用的扩展函数集合.zip,一个方便的收集最常用的kotlin扩展,以提高您的生产力。 立即下载

Kotlin语言中文站

kotlin能够扩展一个类的新功能而无需继承该类,这种方式叫做扩展。例如:你可以为一个你不能修改的,来自第三方库中的类编写一个新的函数,这个新增的函数就像那个原始类本来就有的函数一样。


定义扩展函数

声明一个扩展函数,我们需要用一个接收者类型也就是被扩展的类型来作为他的前缀。

/** 在Extension.kt文件中定义扩展函数 */
fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
    val temp = this[index1]
    this[index1] = this[index2]
    this[index2] = temp
}

//调用
import extension.mutablelist.swap

fun main(args: Array<String>) {
    val list = mutableListOf<Int>(1, 2, 3)
    list.swap(0,2)
    print(list)   //打印:3,2,1
}

看到list.swap(0,2)这行代码,我惊呆了…,我们将代码转成Java看看到底是个啥:

public final class ExtensionKt {
   public static final void swap(@NotNull List $this$swap, int index1, int index2) {
      Object temp = $this$swap.get(index1);
      $this$swap.set(index1, $this$swap.get(index2));
      $this$swap.set(index2, temp);
   }
}


public final class MainKt {
   public static final void main(@NotNull String[] args) {
      List list = CollectionsKt.mutableListOf(new Integer[]{1, 2, 3});
      ExtensionKt.swap(list, 0, 2);
      boolean var2 = false;
      System.out.print(list);
   }
}

这就明白了,简单的一个工厂模式,kotlin编译器最终会将list.swap(0,2)编译成ExtensionKt.swap(list, 0, 2)。


扩展是静态解析的

扩展是静态解析的,扩展不能真正的修改它们所扩展的类,你定义了一个扩展,你并没有在一个类中插入新成员,仅仅是可以通过该类型的变量用点表达式去调用这个函数。

静态解析也就意味着调用扩展函数是由函数调用所在的表达式类型来决定的,而不是表达式运行时求值结果决定的。如下案例:

open class Shape

class Rectangle : Shape()

fun Shape.getName() = "Shape"

fun Rectangle.getName() = "Rectangle"

fun printClassName(s : Shape) {
    println(s.getName())
}

//调用
printClassName(Rectangle())  
//打印Shape。 因为调用扩展函数只取决于参数s的声明类型,该类型是Shape类。

还有种情况提一下,比如类中已经存在函数方法A(),你又给这个类声明了扩展函数A(),然后去调用这个函数,系统会调用哪个函数呢? 答案是类中的成员方法A(),成员方法优先级大于扩展函数。


属性的扩展

扩展属性跟扩展函数一样,是静态解析的,并没有实际将成员插入类中。 扩展属性是没有幕后字段的,也就不能有初始化器,它们的行为只能由显示提供的getters/setters定义。

var MutableList<String>.lastElement: String?
    get() {
        if(size > 0) {
            return get(size -1)
        }
        return null
    }
    set(value) {
        removeLast()
        add(value!!)
    }
    
    
/** 调用 */
import extension.mutablelist.lastElement

fun main(args: Array<String>) {
    val list = mutableListOf<String>("1", "2", "3")
    //取值
    println(list.lastElement)   //打印3

    //赋值
    list.lastElement = "4556"
    print(list.lastElement)  //打印4556
}

提供初始化器报错,如下:

我们也把kotlin代码转成java代码看看:

public final class ExtensionKt {
    @Nullable
   public static final String getLastElement(@NotNull List $this$lastElement) {
      return $this$lastElement.size() > 0 ? (String)$this$lastElement.get($this$lastElement.size() - 1) : null;
   }

   public static final void setLastElement(@NotNull List $this$lastElement, @Nullable String value) {
      CollectionsKt.removeLast($this$lastElement);
      $this$lastElement.add(value);
   }   
}


public final class MainKt {
   public static final void main(@NotNull String[] args) {
      List list = CollectionsKt.mutableListOf(new String[]{"1", "2", "3"});
      String var2 = ExtensionKt.getLastElement(list);
      System.out.println(var2);
      ExtensionKt.setLastElement(list, "4556");
      var2 = ExtensionKt.getLastElement(list);
      System.out.print(var2);
   }
}

根据上面的代码逻辑就比较清晰了,扩展属性也只是提供了静态方法进行属性的操作,var就会有getXXX/setXXX静态方法,val就只有getXXX静态方法。


伴生对象的扩展

如果一个类定义了伴生对象,我们也可以为伴生对象定义扩展函数和属性。和伴生对象的常规成员一样,可以只使用类名作为限定符来调用伴生对象的扩展成员。

class Example {
    companion object {
        fun printInfo() {
            print("printInfo")
        }
    }
}

//伴生对象扩展函数
fun Example.Companion.printInfo() {
    println("Example.Companion.printInfo")
}
fun Example.Companion.printExtensionInfo() {
    println("printExtensionInfo")
}

//调用
fun main(args: Array<String>) {
    Example.printInfo()  //会打印printInfo, 原因:成员函数优先级大于扩展函数优先级
    Example.printExtensionInfo()   //会打印printExtensionInfo
}

扩展声明为成员(在类里面声明扩展)

在一个类内部可以为另外一个类声明扩展。如下所示:

/** 扩展接收者 */
class Host(val hostname: String) {
    fun printHostname() {
        println("Host##printHostname")
    }
}


/** 分发接收者 */
class Connection(val host: Host, val port: Int) {
    fun printPort(){
        print(port)
    }

    fun printHostname() {
        println("Connection##printHostname")
    }

    //扩展函数
    fun Host.printConnectionInfo() {
        /**
         * Host类中存在函数方法:printHostname
         * Connection类中也存在函数方法:printHostname
         * 从打印结果可看出,扩展函数接收者(Host) 优先级高于 分发接收者(Connection)
         */
        printHostname()

        //强制调用Connection中这个函数方法
        this@Connection.printHostname()
    }

    fun connect() {
        host.printConnectionInfo()
        //打印:
        Host##printHostname
        Connection##printHostname
    }
}

备注: 针对分发接收者(Connection)与扩展接收者(Host)的成员名字冲突的情况,扩展接收者(Host)优先。要引用分发接收者(Connection)的成员可以使用:this@Connection.函数名或者属性名 ,代码如上面所示。


上一篇:Kotlin学习历程——抽象类与接口
下一篇:Kotlin学习历程——泛型

Vue3 + MQTT.js 实现 SCADA 实时数据通信:从不稳定到稳定的完整实践 本文介绍了SCADA组态引擎开发中MQTT协议的应用及优化实践。项目采用MQTT协议实现工业设备数据采集与可视化,但面临连接不稳定、数据格式多样化和数据绑定复杂三大问题。针对MQTT连接问题,分析发现超时设置过短(原8秒)、缺少客户端超时配置和心跳机制是主要原因。优化方案包括:协议转换(mqtt://→ws://)、双重超时保护(15秒手动+30秒客户端)、60秒心跳间隔等,显著提升了连接稳定性。通过完整代码实现展示了连接配置、认证处理和错误处理机制,为物联网数据传输提供了可靠解决方案。 阅读详情

相关推荐

地磁场仿真与导航方案设计

地磁场仿真与导航方案设计 地磁场作为地球的固有资源,为航空、航天、航海提供了天然的坐标,可应用于航天器、航空飞行器和舰船等载体的定位、定向及姿态控制。本文依据地磁场的球谐模型,利用Matlab工具,设计了计算任意地点地磁场的程序,对仿真结果与实际数据进行对比分析;并选定一组卫星的数据,结合卫星的运动轨道,描绘90分钟内卫星处地磁总强度/矢量随轨道变化曲线,据此设计一种卫星地磁导航方案。 一、地磁场计算原理 1.1.球谐模型与球谐系数 地磁学的基本问题之一就是用数学表达式将地磁要素的地面分布表示成地理坐标的函

PRQKKK的博客 7408

个人ASIC芯片设计实战:从RTL到GDSII的开源流程解析

芯片设计并非只有大公司才能涉足,ASIC(专用集成电路)作为数字电路的核心方向,如今借助开源工具链已经走向个人开发者。其基本流程是从RTL(寄存器传输级)代码出发,经过逻辑综合、布局布线,最终生成GDSII版图,每一步都依赖于严格的时序约束与物理验证。OpenLane作为成熟的开源ASIC流程,集成了Yosys、OpenROAD等工具,配合SkyWater PDK,可在普通电脑上完成从Verilog设计到版图输出的全流程。这种模式不仅降低了芯片设计的学习门槛,也为FPGA开发者理解后端实现差异、验证自定义模

weixin_33857230的博客 349

【蓝牙专题】HCI协议解析

一、概念: 很多人接触蓝牙,是从HCI开始,因为HCI是主机控制接口协议(Host Controller Interface),蓝牙命令通过HCI来发送到Controller; 1、架构 如下图,HCI通过物理接口(USB、UART等)或虚拟接口,传递数据到Controller,Controller也通过同样的接口发送接收数据,这里注意到HCI层是在L2CAP层之下,LMP层之上; HCI

蚂蚁的专栏 5069

Kotlin学习系列之:扩展(Extension)

当想要扩展一个既有类的功能时,在Java中你能想到的方法:直接修改类的源代码进行功能扩充(当然前提是你可以修改源码,如果该类是别人写的或者说是库和框架提供的,这种方式直接就凉凉)继承,在子类中添加相关方法使用装饰模式,动态扩展对象的功能除了上面说的三种方式外,在Kotlin中还提供一种新的方式:扩展(Extension)。一、扩展函数(Extension Functions)1. 语法形式:fun...

xlh1191860939的博客 3425

【ZZULIOJ】郑州轻工业大学oj题解整合

写在前面 关于ZZULIOJ题解 学习编程,想要巩固无非就是刷题或者做项目,然后因为我大一开始是刷郑轻的题目,就想着自己整合一下自己写的题目。既是复习也是笔记吧。 题解(内有题目描述) 1000 整数a+b 1001 植树问题 1002 简单多项式求值 1003 两个整数的四则运算 1004 三位数的数位分离 1005 整数幂 1006 求等差数列的和 1007 鸡兔同笼 1008 美元和人民币 1009 求平均分 1010 求圆的周长和面积 1011 圆柱体表面积 1012 求绝对值 1013 求两点间

蒟蒻乱写的博客 29万+

企业微信群机器人配置全攻略:从零到消息推送的完整流程

本文详细介绍了企业微信群机器人的配置与使用全流程,从零开始指导如何创建机器人、获取Webhook地址,到通过HTTP请求发送文本、Markdown、图片及模板卡片等多种消息类型。内容涵盖核心的接口配置、安全实践及实战应用场景,帮助开发与运维团队快速构建自动化消息推送中枢,提升协作效率。

weixin_29231725的博客 842

Kotlin学习:Kotlin扩展

Kotlin 扩展 Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。 扩展函数 扩展函数可以在已有类中添加新的方法,不会对原类做修改,扩展函数定义形式 fun receiverType.functionName(params){ body } receiverType:表示函数的接收者,也就是函数扩展的对象 functionName:扩展函数的名称 params:扩展函数的参数

AirField的博客 475

Reeds-Shepp曲线公式推导及代码实现-第二部分(共三部分)

文章目录2. Reeds-Shepp求解2.1 L+S+L+L^+S^+L^+L+S+L+2.2 L+S+R+L^+S^+R^+L+S+R+2.3 L+R−L+L^+R^-L^+L+R−L+2.4 L+R−L−L^+R^-L^-L+R−L−2.5 L+R+L−L^+R^+L^-L+R+L−2.6 L+Rβ+Lβ−R−L^+R_{\beta}^+L_{\beta}^-R^-L+Rβ+​Lβ−​R−2.7 L+Rβ−Lβ−R+L^+R_{\beta}^-L_{\beta}^-R^+L+Rβ−​Lβ−​R+2.8

jianmo的博客 1213

【Kotlin】扩展属性、扩展函数

Kotlin 提供了扩展类或接口的操作,而无需通过类继承或使用装饰器等设计模式,来为某个类添加一些额外的属性或函数,我们只需要通过一个被称为扩展的特殊声明来完成。我们可以将那些第三方类不具备的功能强行进行扩展,方便我们的操作。类的扩展是静态的,实际上并不会修改它们原本的类,也不会将新成员插入到类中,仅仅是将我们定义的功能变得可调用,使用起来就像真的有一样。Kotlin 提供了一些泛型扩展函数(在 Standard.kt 中),如:apply、also、run、let、takeIf、takeUnless等

little_fat_sheep 2360

Android息屏后台任务保活实战:从定时器失效到厂商白名单破解

本文深入探讨了Android应用在息屏后定时任务失效的根源,即系统为省电而触发的休眠机制。文章提供了从传统方案失效分析到实战破解的完整路径,核心在于引导用户将应用加入电池优化白名单并开启自启动权限,从而合法绕过限制。同时,结合WorkManager、AlarmManager等可靠定时方案,实现稳定的后台任务执行。

weixin_28475533的博客 423

YOLO26科研优化:多损失函数(EIoU、SIoU等)融合,让边界框回归精度再上台阶

将原有损失函数替换为我们编写的MultiLoss。例如,在bbox_loss。

LXY_LOVE36的博客 172

kotlin list集合api扩展操作

Java 中已经提供了很强大的集合框架,提供了常用的集合类型,比如 List、Set、Map 等。而 Kotlin 同样提供了一些集合,相比 Java 而言相对简单操作起来更加流畅。本文介绍 Kotlin 中的常见集合类型和适用于集合的操作函数。 Kotlin 中集合 API 请点击这里:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/index.html 下面是 Kotlin 中定义的一些常用的集合接口和类: I

feelinghappy的专栏 921

AD18软件——捕捉栅格、电气栅格、可见栅格的意义及设置

本文介绍了PCB设计中的三种栅格功能:可视栅格用于辅助定位(快捷键Shift+Ctrl+G),捕捉栅格控制光标移动间距(快捷键G),电气栅格实现元件自动吸附(快捷键Shift+E)。同时提供了在Altium Designer中快速查找相同网络标号的两种实用方法:Alt+鼠标单击或双击网络。这些功能可显著提高PCB设计效率和准确性。

qq_37999850的博客 646

初识kotlin(初用kotlin一时爽、一直用一直爽)

初识kotlin(用时一时爽,一直用一直爽)

mid120的博客 5128

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Kotlin学习历程一:Kotlin开发安卓的初体验

1.告别findViewById 不同于 JAVA 中,在 Kotlin 中 findViewById 本身就简化了很多,这得益于 Kotlin 的类型推断以及转型语法后置: val onlyTv = findViewById(R.id.onlyTv) as TextView 在官方库Anko的支持下,可以更简化 当你试图 command/ctrl + 左键点击 onlyTv 想要查...

LeeKumaの技术Note 3197

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kotlin之心路历程

Kotlin之心路历程 以小白眼光看kotlin kotlin这个小丫鬟被谷歌扶正为大房两年,期间看过不少博文,很多人也已经把个人项目迁移到kotlin了,当然国外的开发者更给力,直接大部企业开发已经kotlin,也订阅了涛哥的极客时间(一直没时间看,果然看视频太费事,还是文章可以抽得时间挤一挤学),一直是不想学习啊,一个人的惰性就是这样,java又不是不能用,代码通俗易懂。说句心里话,jav...

ApkCore的专栏 497

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Kotlin学习历程

jiangyinglong123456的博客 117

Kotlin学习基础知识大全(上)

Kotlin是由JetBrains公司开发的一种静态类型编程语言,最初发布于2011年。JetBrains是知名IDE工具IntelliJ IDEA的开发商,他们开发Kotlin的目的是为了解决Java语言在开发效率、代码简洁性和安全性方面的一些不足。2016年2月,Kotlin 1.0正式发布,标志着语言进入稳定阶段。2017年5月,在Google I/O大会上,Google宣布Kotlin成为Android开发的官方支持语言,这一决定极大地推动了Kotlin的普及。Kotlin中使用fun。

百锦再的博客 1万+

Kotlin学习历程——抽象类与接口

Kotlin语言中文站 Kotlin接口可以即包含抽象方法的声明也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。 定义接口 使用关键字interface来定义一个接口: interface A { //有函数体的函数 fun foo() { println("A##foo") } //待实现的函数 fun bar() } 实现接口 一个类可以实现一个或者多个接口。 class C : A { .

hepingdev的专栏 1612

学习笔记之Kotlin系列-Kotlin的介绍

学习笔记之Kotlin系列-Kotlin的介绍 kotlin是什么? ​ Kotlin就是一门由JetBrains 设计开发并开源,可以运行在Java虚拟机、Android、浏览器上的静态语言,它与Java100%兼容,号称Android世界的Swift。并且Kotlin现在是Android应用程序开发人员的首选语言,谷歌在声明中写道:“Android 的开发将越来越以 Kotlin 为先。” K...

JokerMk的博客 226

《Kotlin极简教程》第1章 Kotlin简介

第1章 Kotlin简介 1.1 kotlin简史 1.1.1 Kotlin概述 科特林岛(Котлин)是一座俄罗斯的岛屿,位于圣彼得堡以西约30公里处,形状狭长,东西长度约14公里,南北宽度约2公里,面积有16平方公里,扼守俄国进入芬兰湾的水道。科特林岛上建有喀琅施塔得市,为圣彼得堡下辖的城市。 我们这里讲的Kotlin,就是一门以这个Котлин岛命名的现代程序设计语言。它是一门静态类型编程语言,支持JVM平台,Android平台,浏览器JS运行环境,本地机器码等。支持与Java,Android

AI天才研究院 9598

Kotlin零基础入门到精通(精选)

Kotlin从入门到精通一. Kotlin课程概述1.1 课程安排:1.2 什么是Kotlin?1.3 Kotlin的发展历程1.4 学习目标1.5 必备知识1.6 参考资料1.7 Hello,world二. 数据类型2.1 本章目标2.2 Boolean类型2.3 Number类型2.4 Char类型2.5 类与对象2.6 空类型和智能类型转换2.7 包2.8 区间2.9 数组三. 程序结构3.1 常量与变量3.2 函数3.3 Lambda表达式 一. Kotlin课程概述 1.1 课程安排: 课程介绍

暗余的博客 2万+

kotlin学习和常用知识

Kotlin 是一种由 JetBrains 公司开发的静态类型编程语言,旨在为 Java 开发者提供一种更加安全、简洁、易于使用的编程语言。Kotlin 可以编译成 Java 字节码,因此可以在 Java 虚拟机(JVM)上运行。下面是关于 Kotlin 的详细解释、发展历史、语法学习和代码解读。

AI时代光年 1506

【Kotlin系列01】Kotlin快速入门:环境搭建与Hello World

Kotlin系列第一篇:从零开始学习Kotlin,了解Kotlin的历史与优势,搭建开发环境,编写你的第一个Kotlin程序,掌握基本语法和REPL工具的使用。

Cheson的专栏 960

Kotlin学习(1):Kotlin简介

Kotlin简介、特点以及优势

Caesar的博客 510

【免费下载】 Kotlin从入门到进阶实战 PDF 资源下载

本仓库提供《Kotlin从入门到进阶实战》PDF版本的下载。该资源由azw格式转换而成,虽然排版略有不足,但文字可复制,高清且带有书签,方便读者阅读和学习。 ## 资源描述 《Kotlin从入门到进阶实战》是一本系统介绍Kotlin编程语言的书籍,从基础语法开始,逐步深入到进阶实战。书中不仅涵盖了Kotlin语言的核心概念,还通过项目实战案例,详细讲解了如何使用Kotlin进行服务端开发和An

gitblog_09747的博客 1628
上一篇: Kotlin学习历程——抽象类与接口
下一篇: Kotlin学习历程——泛型
hepingdev
博客等级 码龄5年 3581粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hepingdev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值