首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )

文章目录 一、定义扩展文件 二、重命名扩展函数 三、Kotlin 标准库扩展函数 一、定义扩展文件 ---- 如果定义的 扩展函数 需要在 多个 Kotlin 代码文件 中使用 , 则需要在 单独的...Kotlin 文件 中定义 , 该文件被称为 扩展文件 ; 定义 标准库函数 的 Standard.kt 就是 独立的 扩展文件 ; 代码示例 : 扩展文件一般都 单独定义在一个 Package 中...标准库扩展函数 ---- Kotlin 标准库 提供的功能 , 都是通过 扩展函数 实现的 , 为 现有类 扩展的 标准库文件 都是 在 类名的基础上加上 s 来命名的 , 如 : 为 Sequence..., 造成堆内存开销 ; 该函数中涉及到 两个泛型 T R , 在 fun 关键字后声明 , 为 泛型 T 定义了一个扩展函数 let , 传入 (T) -> R 类型的匿名函数 , 该 Lambda...| 内联函数本质 - 宏替换 ) 博客进行理解 ; Kotlin 中的标准库函数 , 参考 【Kotlin】标准库函数总结 ( apply 函数 | let 函数 | run 函数 | with 函数

1.2K20

Kotlin 扩展函数扩展属性的使用方法

Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。 这通过叫做 扩展 的特殊声明完成。 例如,你可以为一个你不能修改的、来自第三方库中的类编写一个新的函数。...扩展函数调用的话也普通的方法相同。但是你会发现IDE显示的方法颜色有点不一样。 ? 由此也可以看出普通的方法和我们的拓展函数是不同的。下面我们来看看扩展函数的实际实现。...扩展函数一样,在其他文件中声明如下。...这样我们就为 Person 增加了一个扩展属性。可以看看它转化为 Java 代码后的样子,扩展函数没啥区别。...总结 在 Java 中,我们要扩展一个类时,常常是继承该类或者用装饰者模式类似的设计模式来实现,Kotlin 扩展函数扩展属性为这种需求提供了一种新思路,并且也可以作为 Utils 类的另外一种选择

2.4K40
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin 函数声明扩展(extension)

无法继承/重写这些类及其方法,只能通过 Utils 扩展; 2. 继承一个类比抽取代码块封装为函数的实现成本+替换成本高; 3....Kotlin 扩展的使用实现分析 声明一个 Kotlin 扩展如下: // StringUtils.kt fun String.appendHaha(): String { return this...扩展声明为顶层声明的时候可以被外部调用(是的,因为函数是一等公民,在方法内部也可以声明扩展方法)。 在函数体内用 this 来引用调用的实例,属性方法的访问权限与普通调用一致。...实际上 Java 想要调用 Kotlin扩展方法也确实是这样调用的。 扩展方法的调用实例方法调用一致,在调用者角度没有区别。...相比 Utils 工具类,Kotlin 扩展特性能有效减少开发者心智负担沟通成本,从而提高开发效率。

95020

Kotlin---标准扩展函数

介绍 除了自定义扩展之外,Kotlin中也定义了很多的扩展函数,而这些扩展函数的接收类型是范型,也就是所有对象都可以使用。这些标准的扩展函数都放在了Standard.kt中。...从Kotlin的语言介绍中,可以知道,Kotlin在空指针以及null对象的控制、语句表达上有很多优势,很多优势也来源于Kotlin扩展函数的支持。...block(this):执行代码块中的代码,并且将调用扩展函数的对象作为参数传入,返回结果 let函数举例 例如下面的函数,如果student不为空的话,则会打印名字年龄。...let扩展函数来使用 fun acceptStudent(student: Person?)...predicate(this)) this else null } with函数 with函数不是一个扩展函数,它的原型如下: 这个函数主要会接收一个对象,然后调用该对象的扩展代码块,然后返回代码块中的值

50520

Kotlin扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )

分别在 本包 外包 中定义扩展函数 : ① 本包定义扩展函数 : 普通的扩展函数定义 , 在 extendbean 包的文件下定义 Student 类 , 在 extendbean 包的文件下定义...重载说明 : 扩展函数在同一个包内 , 可以进行重载操作 , 即定义函数名相同 , 参数列表返回值类型或顺序不同的函数 , 两个同名函数签名不同 , 因此可以区分调用 ; V ....定义重载扩展函数 : 为 Student 扩展了两个函数 , 分别是 printName() printName(num : Int) , 这两个函数签名不同 , 可以定义 , 调用时根据不同的函数签名分别调用...情况 一 : 在包内调用本包外包的 相同签名的 扩展函数 ; ① 导入的包优先级高 : 如果导入外包扩展函数 , 就会调用外包的扩展函数 ; ② 本包默认优先级较低 : 如果没有导入 , 就会默认调用本包定义的的扩展函数...在 extendusage 包中调用扩展函数分析 : 这是个第三方包 , 分别在 extendbean extenddeclare 定义了两个相同函数签名的 Student 扩展函数 ; ① 声明哪个包就调用对应包的方法

74320

Kotlin扩展函数知识点

为什么需要扩展 一个新特性的出现必然是为了解决之前遗留的开发问题提升目前开发效率。扩展函数也是如此。 首先来介绍下OOP:开放封闭原则。 软件应该是可扩展,而不可修改的。...Kotlin扩展函数很显然能够优雅的解决这种问题。...总结下,如果没有定义在类中那么该函数就是静态的大家都可以调用。如果定义在类中那么就默认属于该类子类的普通函数,所以只有在该类子类中使用。...静态扩展函数 首先来回顾下普通的静态函数/变量如何定义,在Kotlin中使用伴生对象类将函数/变量定义在其中,那么该函数/变量就是静态函数/变量了。...这样似乎看起来没有什么问题,但是当我们需要扩展三方类的静态函数时,如果其没有用Kotlin的伴生对象指定静态方法/变量,那么该方案将无法使用,只能用实例去调用。

28230

Kotlin扩展函数 ① ( 扩展函数简介 | 为 Any 超类定义扩展函数 | private 私有扩展函数 | 泛型扩展函数 | 标准函数 let 函数是泛型扩展函数 )

扩展函数 , 可以在 不修改 原有类 的情况下 增加类的功能 ; Kotlin 中如果类 没有被 open 关键字修饰 , 则该类 不能被继承 , 如果想要扩展该类 , 可以使用 扩展函数 ; 扩展函数...): 返回值类型 { 函数体 } 定义扩展函数 与 定义普通函数唯一的区别是 扩展函数 前多了 类名. ; 下面的代码中 , 为 String 定义扩展函数 , 拼接原字符串扩展函数参数 , 并将结果返回...; 代码示例 : /** * 为 String 定义扩展函数, 拼接原字符串扩展函数参数, 并将结果返回 */ fun String.addStr(str: String): String {...---- 如果 扩展函数 使用 private 修饰 , 则该扩展函数 只在该 Kotlin 代码文件中有效 , 在其它的 Kotlin 代码中就无法调用了 ; 代码示例 : 在 Hello.kt 代码中..., 避免创建匿名函数相关对象 , 造成堆内存开销 ; 该函数中涉及到 两个泛型 T R , 在 fun 关键字后声明 , 为 泛型 T 定义了一个扩展函数 let , 传入 (T) -> R 类型的匿名函数

1.6K20

Kotlin扩展函数与实现机制探索

这些都是通过叫做“扩展(extensions)”的特殊声明实现的。Kotlin扩展声明既支持扩展函数也支持扩展属性,本文主要讨论扩展函数,至于扩展属性实现的机制类似。...中的List容器类,这里在声明里作为“接受者类型”,.作为声明关键字,swap是扩展函数名,其余Kotlin声明一个普通函数并无区别。...3.2 如果扩展函数现有的类成员发生冲突,kotlin将会默认使用类成员,这一步选择是在编译期处理的,生成的字节码是将会是调用类成员的方法,如下例子: class C{ fun foo...3.3 Kotlin严格区分了可能为空不为空的入参类型,同样也应用在扩展函数的中,为了声明一个可能为空的接受者类型,可以参考如下例子: fun MutableList?....3.5 如果留意前面的例子,我们会发现kotlin的this语法JAVA不同,使用范围更灵活,仅以扩展函数为例,当在扩展函数里调用this时,指代的是接受者类型的实例,那么如果这个扩展函数声明在一个类内部

2.3K72

Kotlin 扩展函数 与 JS 的 prototypeKotlin 扩展函数 与 JS 的 prototype

Kotlin 扩展函数 与 JS 的 prototype Kotlin 扩展函数 Kotlin扩展函数功能使得我们可以为现有的类添加新的函数,实现某一具体功能 。...扩展函数是静态解析的,并未对原类添加函数或属性,对类本身没有任何影响。 扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。...(extensions) 在不修改原类的情况下, Kotlin能给一个类扩展新功能,无需继承该类,也不用任何设计模式(如装饰模式等), Kotlin支持扩展函数扩展属性!...扩展函数类似,Kotlin也支持扩展属性: val List.lastIndex: Int // 不能初始化 get() = size - 1 // 只能由getters...3.伴生对象-扩展函数属性 可为伴生对象定义扩展函数属性: class MyClass { companion object { } //伴生对象 } fun

1.6K20

Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )

内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I ....内联扩展函数 apply ---- 1 . apply 函数原型 : 泛型 T 类型对象 , 调用 apply 方法 , 后面定义了一个闭包代码块 ; 调用 apply 方法的对象类型是泛型 , 说明任何对象都可以调用该方法...: 扩展了调用 apply 函数的泛型类型 T 的对象的操作方法 , 等同于为泛型 T 对象定义了一个新的方法 ; 3 . apply 函数调用对象 : 所有的对象都可以调用 apply 函数 , 4...Kotlin 调用 Java API ---- Kotlin 与 Java 代码是完全兼容的 , 因为其都是基于 Java 虚拟机的语言 ; Kotlin 中可以调用 Java 语言的类方法 ; Java...语言中也可以调用 Kotlin 的类方法 ; 因此 Kotlin 中是可以调用 Java 的 API 函数库的 , 这极大的拓展了 Kotlin 的功能 ; III . apply 内联扩展函数示例

2.6K20

Kotlin扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )

扩展函数 前多了 类名. ; 下面的代码中 , 为 String 定义扩展函数 , 拼接原字符串扩展函数参数 , 并将结果返回 ; 代码示例 : /** * 为 String 定义扩展函数, 拼接原字符串扩展函数参数..., 避免创建匿名函数相关对象 , 造成堆内存开销 ; 该函数中涉及到 两个泛型 T R , 在 fun 关键字后声明 , 为 泛型 T 定义了一个扩展函数 let , 传入 (T) -> R 类型的匿名函数...---- 如果 扩展函数 只有 一个参数 , 并且在 扩展函数 定义时 使用了 infix 关键字修饰 , 在调用该扩展函数时 , 可以省略 接收者与函数之间的点 参数列表的括号 ; 调用 使用...被 infix 修饰的 泛型扩展函数 , 最终产生的是 Pair 实例对象 ; /** * 从this[that]创建类型为[Pair]的元组。..., 造成堆内存开销 ; 该函数中涉及到 两个泛型 T R , 在 fun 关键字后声明 , 为 泛型 T 定义了一个扩展函数 let , 传入 (T) -> R 类型的匿名函数 , 该 Lambda

2K30

转向Kotlin——类接口

类的声明 Java没有什么两样,Kotlin中,类的声明也使用class关键字,如果只是声明一个空类,KotlinJava没有任何区别,不过定义类的其他成员,区别就很大了。...KotlinJava一样,都是单继承的,也就是说,一个Kotlin类只能有一个父类。...Kotlin与Java类似,使用interface声明接口,一个类可以实现多个接口,实现的方法类继承相同,而且,接口中的属性方法都是open的。...抽象类 抽象类接口非常相似,抽象类不能被实例化,需要abstract关键字声明,抽象类实现接口后,接口中没有函数体的函数可以不重写,接口中的这些方法自动被继承到子类中,称为抽象方法: abstract...小结 Kotlin中的类e接口与Java中的本质上没有什么两样,只不过Kotlin为了体现差异,加入了一些语法糖,如接口允许函数函数体,支持属性,不支持静态方法等。我们需要慢慢去熟悉它。

89930

Kotlin---扩展

介绍 除了与Java类比的这些功能之外,Kotlin还新增了一些新的概念 数据类(data) 扩展函数 密封类(sealed) 匿名类 伴生对象(Companion) 数据类 通过data关键字来定义数据类...day: Int) { fun getDay(): String { return "year:$year...month:$month...day:$day" } } 扩展函数...而在Kotlin中提供了扩展函数可以来完成这一些操作。 我们可以在使用的类中,通过以下方式来定义类的扩展函数。但是该扩展函数的使用范围仅在这个类中使用。...date: Date) { date.creatDay() } fun Date.creatDay() { this.getDay() } } 通过扩展函数的方式来完成对与数据类以及其他类的隔离...同样,Kotlin也支持扩展属性,与函数类似定义。 密封类 密封类用来表示受限制的类继承结构。由于enum每一个实例都是一个常量,所以密封类被开发,密封类的子类可以有多个实例。

57430

Kotlin中的扩展函数与属性示例详解

* 联系方式:QQ:282921012 * 功能描述: */ fun String.lastChar(): Char = get(this.length - 1) 要做的,就是把要扩展的类或者接口的名称...和在类内部定义的方法不同的是,扩展函数不能访问私有的或者是受保护的成员。 3.3.1导入扩展函数 对于定义的一个扩展函数,它不会自动地在整个项目范围内生效。...Kotlin允许用导入类一样的语法来导入单个的函数: import strings.lastChar //星号导入 import strings.* 3.3.2在Java中调用扩展函数 其实,扩展函数是静态函数...3.3.4不可重写的扩展函数 扩展函数并不是类的一部分,它是声明在类之外的。扩展函数并不存在重写,因为Kotlin会把它们当做静态函数对待。...3.3.5扩展属性 val String.lastChar: Char get() = get(this.length - 1) 扩展函数一样,扩展属性也像接收者的一个普通成员属性一样。

1.3K20

kotlin--扩展

之间使用了kotlin的标准函数、匿名函数,觉得它十分灵活,简便。...其实kotlin的标准函数就是用了扩展 一、扩展函数 1.定义扩展函数 当我们需要对一个类新增一个方法时,在Java中需要写一个子类继承它,然后添加我们的新方法。...在kotlin中,可以利用扩展增加类的功能,指定类名后就可以新增函数 我们给所有类新增打印函数,给String新增加上!...getInfo函数支持扩展 很简单,直接使用T.getInfo()就可以实现 2.作用域可以直接使用接收者的函数属性,也是扩展的特性,反观下我们上面写的扩展中,函数里使用的this就是接收者,所以扩展函数中...,可以直接使用接收者的函数属性 想要入参的匿名函数作用域可以直接使用接收者的函数属性,就需要匿名函数支持扩展: fun main() { println("abc".getInfo {

30620

Kotlin扩展

目前大多说的高级语言在对已有的class进行扩展大多采用继承或者装饰器的方式,但是这些方式大都会破坏原类,对整个项目来说是一种侵入式极强的方式……Kotlin在function这方面吸取了一些动态语言(...OC)仿照姊妹篇swift的方式可以对已有的class进行方法扩展达到了可以在不重新已有类修改代码或者使用子类的方式对类进行功能的扩展…… 声明一个扩展方法 对于一个方法可定是有接收者,因此在方法扩展需要添加...如果一个类定义有一个成员函数与一个扩展函数,而这两个函数又有相同的接收者类型、 相同的名字,并且都适用给定的参数,这种情况总是取成员函数 扩展为静态解析 扩展不是原有类进行修改来实现扩展的,它仅仅是可以通过类的实例化之后通过点语法调用的一个函数而非是类实例的一个成员方法...move 扩展属性 扩展属性与扩展方法类似 val List.lastIndex: Int get() = size - 1 扩展作用域 杜宇扩展要想挎包访问,需要在包内import...扩展出的方法

44930

Kotlin中的sam(函数接口)详解

,这种接口kotlin中被当作函数接口,或者SAM接口,SAM代表单抽象方法,类似的还有像RunnableCallable这样的函数接口....SAM构造方法:显式地把lambda转换成函数接口. 在有的方法中需要返回一个函数接口,不能返回一个lambda, 可以用SAM构造方法把它包装起来....如下 fun createAllDoneRunable() : Runnable{ return Runnable{ println(“All done”) } } SAM函数名称底层函数接口的名称一样...SAM构造方法只接收一个参数-一个被用作函数接口单抽象方法体的lambda,并返回一个接口类的实例....另外除了返回值通过lambda创建函数接口外,也可以把lambda生成的函数接口放在一个变量中,如下 val listener = OnClickListener{ view - val text

1.6K40
领券