Kotlin入门-程序员的福利,扩展篇

Kotlin入门实例大全(完结) Kotlin Cases(更新中) Shawn IDE: IntelliJ IDEA 2018.2.3 Kotlin: 1.2.71 JDK: 1.8.0_161 强烈推荐Kotlin官方文档 代码见github 注: 本文中实例部分参考于 runoobJava实例 Kotlin入门实例Kotlin Cases(更新中)1 字符串1.1 字符串比较 StringCompare1.2 查... 阅读详情

在这里插入图片描述

前言

为了更动态的解决函数的扩展问题,进而提升编码效率。这算是一项程序员的福利。

除了文字版本,也有Xmind版本 github地址

目录结构是这样的

  • 定义
  • 扩展函数
  • 扩展函数是静态解析的
  • 可空接收者
  • 扩展属性
  • 伴生对象的扩展
  • 扩展的作用域
  • 扩展声明为成员

定义

Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。

比如说
  • 为第三方库中无法修改的类编写 新function,新function就如同该类原来就存在的函数一般使用。
  • 也可以为第三方类扩展一些新的属性

扩展函数

可以在已有类中添加新的方法,不会对原类做修改

fun receiverType.functionName(params){
    body
}

receiverType
表示函数的接收者,也就是函数扩展的对象
functionName
扩展函数的名称
params
扩展函数的参数,可以为NULL

范例
class User(var name:String)

/**扩展函数**/
fun User.Print(){
    print("用户名 $name")
}
		fun main(arg:Array<String>){
    var user = User("Runoob")
    user.Print()
}

是不是有一种js的既视感


扩展函数是静态解析的

具体被调用的的是哪一个函数
由调用函数的的对象表达式来决定

open class C

class D: C()

fun C.foo() = "c"   // 扩展函数 foo

fun D.foo() = "d"   // 扩展函数 foo

fun printFoo(c: C) {
    println(c.foo())  // 类型是 C 类
}

fun main(arg:Array<String>){
    printFoo(D()) //#输出c
}

若扩展函数和成员函数一致
优先使用成员函数

class C {
    fun foo() { println("成员函数") }
}

fun C.foo() { println("扩展函数") }

fun main(arg:Array<String>){
    var c = C()
    c.foo()   //#输出  成员函数
}

可空接收者

范例
fun Any?.toMyString(): String {
    if (this == null) return "null"
    // 空检测之后,“this”会自动转换为非空类型,所以下面的 toString()
    // 解析为 Any 类的成员函数
    return toString()
}

这里的Any?是一个可以为null的对象;

通过 this == null的判断,可以让你在没有进行null判断,就调用toMyString方法


扩展属性

val <T> List<T>.lastIndex: Int
    get() = size - 1

lastIndex是扩展出来的属性

只能通过get来获取
扩展属性只能被声明为 val
允许定义在类或者kotlin文件中

不允许定义在函数中

否则会报Local extension properties are not allowed

范例
class Outer2 {                  // 外部类
    private val bar: Int = 1
}

val Outer2.newBar : Int
    get() = 222212

fun main(args: Array<String>) {
    println(Outer2().newBar) //   222212
}

因为是扩展的属性,他是不具备初始化器的。

  • 扩展不能真正的修改他们所扩展的类
  • 你并没有在一个类中插入新成员
  • 仅仅是可以通过该类型的变量用点表达式去调用这个新函数
范例二
val House.number = 1 // 错误:扩展属性不能有初始化器

伴生对象的扩展

class MyClass {
    companion object { }  // 将被称为 "Companion"
}

companion object即伴生对象
伴生对象在类中只能存在一个
类似于java中的静态方法

这可以这么写。

范例一
class MyClass {
    companion object CcName{
    }  // 将被称为 "Companion"
}

fun MyClass.CcName.printCompanion() { println("companion") }

fun main() {
    MyClass.CcName.printCompanion()
}
范例二
class MyClass {
    companion object { }  // 将被称为 "Companion"
}

fun MyClass.Companion.printCompanion() { println("companion") }

fun main() {
    MyClass.printCompanion()
}

扩展的作用域

与java一样
需要import具体的,或者*
大多数时候我们在顶层定义扩展

  • 直接在包里
  • 扩展范例
    package org.example.declarations
    
    fun List<String>.getLongestString() { /*……*/}
    

使用所定义包之外的一个扩展

调用范例
package org.example.usage

import org.example.declarations.getLongestString

fun main() {
    val list = listOf("red", "green", "blue")
    list.getLongestString()
}

扩展声明为成员

在一个类内部你可以为另一个类声明扩展

范例
class Host(val hostname: String) {
    fun printHostname() { print(hostname) }
}

class Connection(val host: Host, val port: Int) {
     fun printPort() { print(port) }

     fun Host.printConnectionString(p: Int) {  //这是扩展函数。函数内的this指向Host本身。
                                                                        //但是可以通过this指定到Connection的this
         printHostname()   // calls Host.printHostname()
         print(":")
         printPort()   // calls Connection.printPort()
     }

     fun connect() {
         /*……*/
         host.printConnectionString(port)   // calls the extension function
     }
}

fun main() {
    Connection(Host("kotl.in"), 443).connect()
    //Host("kotl.in").printConnectionString(443)  // error, the extension function is unavailable outside Connection
}

这个范例,kotlincn的说法其实是有点绕口的。细细品味,文中所谓的,不正说的是 this的指向问题吗?

故障jenkins 连接git问题,jenkins执行脚本问题,Gitlab local network are not allowed问题 一构建拉取代码故障现象: 查看构建控制台输出 网上分析原因: yum install git 安装的Git版本过低,应该用jenkins安装插件或自行安装更高版本 通过https://blog.youkuaiyun.com/wudinaniya/article/details/97921383更新版本后,无果。 原理:dev把ssh key公钥放在远程仓库Gitlab上,免交互... 阅读详情

相关推荐

揭秘Kotlin编程精华,讲干货、不废话:《Kotlin从入门到进阶实战》 阿里巴巴资深程序员力作...

《Kotlin从入门到进阶实战》 前言 Kotlin是一门非研究性的语言,它是一门非常务实的工业级编程语言,它的使命就是帮助程序员们解决实际工程实践中的问题。使用Kotlin 让 Java程序员们的生活变得更好,Java中的那些空指针错误,浪费时间的冗长的样板代码,啰嗦的语法限制等等,在Kotlin中统统消失。Kotlin 简单务实,语法简洁而强大,安全且表达力强,极富生产力。 Java诞生于19...

AI天才研究院 9374

Kotlin笔记4-可见性修饰符和扩展函数

参考自官网介绍:http://kotlinlang.org/docs/reference/extensions.html   1. Visibility Modifiers 可见性修饰符 可见性修饰符有四种:private, protected, internal and public,默认是public 可以用于修饰类、伴生对象object、接口、构造函数、一般函数、属性和其setter...

Hello CYC 435

Sentinel2 哨兵2数据下载方法(USGS)-史上最全讲解

本文讲述了从USGS官网下载Sentinel2的方法。主要包括USGS官网的注册和下载流程,以及选定研究区中所出现的问题、解决办法。

xiatiandexia123的博客 6万+

kotlin 练习

Kotlin 定义函数的一些语法 fun main(args:Array<String>):Unit { val x:() -> Unit = { println("hello") } // 无参数函数,声明类型时用 ()-> 实现时不能要,{() -> println("hello")} 是错误的 val odd:(Int) ->...

weixin_30379973的博客 191

C#开发医学影像胶片打印系统(一):万能花式布局的实现思路

本篇文章将介绍开发医学影像胶片打印系统(printscu模式)遇到不规则排版时的一种思路,一般来讲,医院打印胶片时都是整张胶片打印,但有时需要将多个病人或一个病人的多个检查打印在同一张胶片上,这时候就需要不规则排版来满足打印需求,使胶片利用率最大化。

罗万科技的博客 1325

国科大作业考试资料-人工智能原理与算法-2024新编-第十一次作业整理

1、有一位教授想知道学生是否睡眠充足。每天,教授观察学生在课堂 上是否睡觉,并观察他们是否有红眼。教授获得如下的领域知识: (1)没有观察数据时,学生睡眠充足的先验概率为0.7。 (2)给定学生前一天睡眠充足为条件,学生在晚上睡眠充足的概率是0.8;如果前一天睡眠不充足,则是0.3。 (3)如果学生睡眠充足,则红眼的概率是0.2,否则是0.7。 (4)如果学生睡眠充足,则在课堂上睡觉的概率是0.1,否则是0.3。 将这些信息形式化为一个动态贝叶斯网络,使教授可以使用这个网络从观察序列中进行滤波和预

MatsumotoChrikk 1055

思维导图|kotlin扩展

大家好,我是青空。今天给大家带来的是kotlin扩展。文末可领取大厂面试题Kotlin 扩展定义Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。比如说为第三方库中无法修改的类编写 新function,新function就如同该类原来就存在的函数一般使用。也可以为第三方类扩展一些新的属性扩展函数可以在已有类中添加新的方法,不会对原类做修改fun receiverType.functionName(params){     bo

青空coding 182

第14.5章 高翔博士最新开源框架Lightning-LM源码解读(五):揭秘位姿图优化核心模块,从数学原理到代码实现

本文介绍了Lightning-LM框架中的位姿图优化(PGO)模块实现。该模块通过融合多源定位信息(激光定位、激光里程计、DR等),构建并优化位姿图来获得更精确的位姿估计。 主要内容包括: 模块概况与数据流程:初始化配置→添加PGO帧→分配位姿→优化求解→更新位姿→滑动窗口 16个核心函数详解:从构造函数到边缘化处理,涵盖完整的PGO工作流程 关键技术点:噪声参数设置、优化问题构建、约束添加、异常值处理等 关键数据结构:帧队列管理、顶点和边构建、优化统计信息收集 该PGO模块采用增量式优化方式,支持多种约束

行知SLAM 1216

Kotlin Extensions扩展(翻译)

Extensions Kotlin语言拥有不通过继承基类和使用类似与装饰器模式的设计模式而去为一个类去增加一个新的功能的能力。 这种能力称为Extensions。Kotlin支持extension functions 和 extension properties。 Extension Functions 去申明一个extension function。我们需要将被被添加申明的类别前置作为接...

xiaocajiyyd的博客 674

迟滞比较器原理及计算

为什么要用迟滞比较器 在讲迟滞比较器之前,我们先看一个案例。 在产品设计中常常需要用到电机,而电机在从运转到停止过程中需要泄放能量,这种能量大部分以电压的形式反馈回电源母线(Vbus)导致Vbus母线电压升高,特别是功率大又转速快的电机需要急刹时,产生的反馈电压更高,严重时可能导致母线上其他器件的损坏。 为了防止将电机反馈的能量泄放掉,我们需要设计一个电路来检测母线电压,当母线电压高于某一安全阈值时,打开MOSFET Q1将母线上的能量通过电阻R5以热的形式消耗掉。 假如用一般的比较器,设计如下: Vbu

sinat_15677011的博客 2万+

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

Kotlin教程,从入门到精通

前言 Kotlin现在已经更新至1.3. 后续,也将以1.3版本进行讲解。 围绕 What(是什么)、How(怎么用)、Difference(与java的区别)、Intent(意图是什么)四个方面来阐述。 产物:Kotlin整理后的Xmind(更新在github上) 目录结构 [基础篇] 基本类型 ...

王学明 2101

【WLAN】【测试】WPS测试方法小结

手机 一般稍微老的手机会支持,新手机反而不支持。 比如小米6(系统版本新的话不支持)在设置——高级设置——WPS连接。 笔记本 有些笔记本(如Surface Laptop 3)天生支持WPS,比如在连接某SSID的时候,会有“也可以通过按路由器上的按钮连接”这样的字样,出来后按AP的WPS按键即可以进行连接。 Qss软件 AP mesh组网中,Controller和Agent之间通过WIFI组网,可使用WPS的方式进行连接。可利用这点用Agent来测试AP的WPS功能。 ...

一介草民,只为生活。 1万+

秒懂Kotlin之Java程序员如何快速掌握Kotlin

Kotlin/JVM 可以看做是对改进Java的一种积极的尝试,其试图改进Java的已知的被广泛讨论的缺点。 关于Kotlin与Java的爱恨情仇此处按下不表,等有机会单独写一篇相关文章。此文仅从Java惯用者的角度给出使用Kotlin的一些建议,这往往是Java惯用者迅速掌握Kotlin至关重要的方面。 本文主要着眼于Kotlin与Java在语法上差异,便于Java惯用者快速上手Kotlin。 基于Kotlin 1.4.0 版本 通用差异 Kotlin中的方法和属性可以不存在于类中 我们知道,Jav

ShuSheng007的程序人生 4419

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Kotlin 入门到精通 扩展(五),Android程序员的春天

以下是资料目录和内容部分截图里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。一份Flutter高级入门进阶资料PDF以下是资料目录和内容部分截图[外链图片转存中…(img-k2JRlF8O-1711935686245)][外链图片转存中…(img-Jyc1hx7P-1711935686246)]里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

2401_83620690的博客 812

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Kotlin的扩展

Kotlin中扩展能够在无需继承的情况下,为一个类扩展新的功能。能够使得代码更为的简洁。通过反编译分析后,可以知道扩展的本质就是实现了一个静态方法。[1][让人爱不释手的Kotlin扩展(Extensions)技术探Extensions秘与应用] ([2]如何查看 Kotlin 编译后的Java 代码,方法如下: 在 Android Studio 顶部菜单中找到 Tools -> Kotlin ->Show Kotlin Bytecode;

2401_84149381的博客 955

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Kotlin 扩展函数

在这里,我们使用扩展函数扩展了函数库函数。的,即执行哪个扩展函数完全取决于调用它的表达式的类型,而不是在运行时最终执行表达式时解析的类型。扩展函数可以添加到库类中,并以与用户定义的类类似的方式使用。的类类型定义扩展函数。在这种情况下,当在扩展函数中添加对 null 的检查并返回相应的值时。,但是由于扩展函数是静态解析的,所以操作函数在类型 A 上调用。调用成员函数时,它返回圆的面积,同样,扩展函数返回圆的周长。就像调用伴生对象的常规成员函数一样,可以仅使用类名作为限定符来调用扩展函数。

jianqimingtian的博客 389

android java调用kotlin中的类_Java程序员如何才能快速掌握Kotlin

概述Kotlin/JVM 可以看做是对改进Java的一种积极的尝试,其试图改进Java编程语言中已知的被广泛讨论的缺点与不足。因为我多年前从事过C#的开发,初次看到Kotlin,感觉好多特性C#好多年前就有了。足见Java是多么的传统,不愿意过多的引入语法糖。关于Kotlin与Java的爱恨情仇此处按下不表,等有机会单独写一篇相关文章。本文仅想从Java惯用者的角度给出Kotlin与Java的一些...

weixin_36296864的博客 1999

kotlin从入门到精通Android开发【Android程序员必读】

首先,看看kotlin的工资吧?作为本科生,做kotlin能拿到35K的高薪,作为大专生,成为kotlin研发工程师能拿到25K的薪资。

Gaga246的博客 1944

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

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

gitblog_09747的博客 1628

Kotlin快速入门

本文是Kotlin基础语法的快速入门指南,主要面向有一定编程基础的开发者。课程重点讲解了Kotlin的核心语法特性,包括:程序主函数的简化写法(fun main())、变量声明规则(var/val的区别)、字符串模板的使用($变量和${表达式})、函数定义与调用(包括默认参数和命名参数)、以及编码规范和注释语法。文章强调Kotlin相比Java的语法优势,如类型推断、字符串模板等特性,并提供了大量代码示例。最后总结了Kotlin基础语法的核心要点,帮助开发者快速掌握Kotlin编程思维,为后续Android

言之。 1万+

阿里架构师开源《Kotlin入门教程指南》+《高级Kotlin强化实战》

2017年发布之初,Kotlin一度非常火爆,简洁、安全又实用的编程方式,让Android开发者们逃离了空指针异常的噩梦,工作效率大大提高。 如果你现在在从事Android开发,那么你在查看源码时就会发现在使用一些 Jetpack 框架的时候,大部分都是Kotlin 语言。

嘴巴吃糖了 962

Kotlin快速入门,Java转Kotlin学它就够了!

这个笔记根据B站视频《2021最新最全Kotlin教程Android程序员定制版,Java转Kotlin学它就够了!更新完毕》总结。感谢动脑学院的支持。

倪灵-ziop 2448

Kotlin程序员必备算法面试宝典与实战技巧

算法是程序员面试的核心考察点,尤其对于Kotlin开发者而言,如何在保持语言特性的同时展现扎实的算法基础至关重要。数据结构与算法作为计算机科学的基础,其原理理解直接影响代码质量和系统性能。Kotlin通过inline、tailrec等特性为算法优化提供了独特优势,例如使用尾递归优化斐波那契数列实现,或通过扩展函数提升代码可读性。在实际工程场景中,算法广泛应用于缓存策略(如LRU实现)、数据处理等模块。本文重点解析Kotlin实现经典算法的技巧,包括链表、排序算法的现代化写法,以及如何利用协程处理并发场景下的

weixin_30698527的博客 406

Kotlin入门实用开发技巧与注意事项

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点Kotlin,这门由 JetBrains 开发的现代编程语言,自 2017 年被 Google 宣布为 Android 官方开发语言以来,便迅速在开发者社区中流行起来。它以其简洁的语法、空安全的特性和与 Java 的无缝互操作性而受到青睐。作为一名资深程序员,我将为刚入门 Kotlin 的开发者分享一些实用的开发技巧和注意事项,帮助你快速上手并避免常见的陷阱。

AntDream的程序世界 1050
上一篇: Kotlin入门-必会,接口
下一篇: Kotlin入门-数据类与密封类 的解脱,由繁至简
手艺人王学明
手艺人王学明 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄17年 441粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值