文章目录
I . 内联扩展函数 apply
II . Kotlin 调用 Java API
III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 )
I . 内联扩展函数 apply
1 . apply 函数原型 : 泛型 T 类型对象 , 调用 apply 方法 , 后面定义了一个闭包代码块 ; 调用 apply 方法的对象类型是泛型 , 说明任何对象都可以调用该方法 ;
/** * Calls the specified function [block] with `this` value as its receiver and returns `this` value. * * For detailed usage information see the documentation for [scope functions] * (https://kotlinlang.org/docs/reference/scope-functions.html#apply). */ @kotlin.internal.InlineOnly public inline fun <T> T.apply(block: T.() -> Unit): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() return this }
2 . apply 函数作用 : 扩展了调用 apply 函数的泛型类型 T 的对象的操作方法 , 等同于为泛型 T 对象定义了一个新的方法 ;
3 . apply 函数调用对象 : 所有的对象都可以调用 apply 函数 ,
4 . 闭包代码块 说明 :
① 主要功能 : apply 函数可以指定要执行的代码块 , 再代码块中可以使用 this 访问其调用对象 , 执行完毕后 , 会自动返回该对象 ;
② 调用 T 对象本身 : 使用 this 可以访问该对象 , 不是 it ;
③ 特点 : 在 apply 后的闭包内 , 可以调用该 T 对象的所有成员方法 和 成员变量 ;
④ 返回值 : appay 方法返回泛型类型 T 对象本身 , 即在闭包内执行的针对 T 对象的内容是保存下来的
II . Kotlin 调用 Java API
Kotlin 与 Java 代码是完全兼容的 , 因为其都是基于 Java 虚拟机的语言 ;
Kotlin 中可以调用 Java 语言的类和方法 ;
Java 语言中也可以调用 Kotlin 的类和方法 ;
因此 Kotlin 中是可以调用 Java 的 API 函数库的 , 这极大的拓展了 Kotlin 的功能 ;
III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 )
package pic import java.awt.image.BufferedImage import java.io.File import javax.imageio.ImageIO /* Kotlin 图像处理 涉及到调用 Java API 中的方法 */ fun main() { /* Kotlin 中可以使用 Java 的所有 API , 这里使用 Java 的图像操作 API 进行图像处理 作用 : BufferedImage 作用是在内存中生成图片 , 下面代码的含义是 : 在内存中传入一个宽高为 100 像素, 像素格式为 TYPE_INT_RGB 的图像 构造方法 : BufferedImage 初始化传入的三个参数分别是 图像的 宽 和 高 , 图像的像素格式 RGB */ var image = BufferedImage(100 , 100, BufferedImage.TYPE_INT_RGB) /* 使用高阶函数 ( 参数和返回值为函数的函数 ) Calls the specified function [block] with `this` value as its receiver and returns `this` value. For detailed usage information see the documentation for [scope functions] (https://kotlinlang.org/docs/reference/scope-functions.html#apply). @kotlin.internal.InlineOnly public inline fun <T> T.apply(block: T.() -> Unit): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() return this } apply 函数作用 : 作用 : 扩展了调用 apply 函数的泛型类型 T 的对象的操作方法 , 等同于为泛型 T 对象定义了一个新的方法 特点 : 在 apply 后的闭包内 , 可以调用该 T 对象的所有成员方法 和 成员变量 返回值 : appay 方法返回泛型类型 T 对象本身 , 即在闭包内执行的针对 T 对象的内容是保存下来的 调用 T 对象本身 : 使用 this 可以访问该对象 , 不是 it apply 接收一个函数类型参数 block: T.() -> Unit 函数类型变量名 : block 是函数类型实例名称 T.() -> Unit : 函数类型 T 表示 image 本身 T.() 表示 image 本身的成员方法 , 其返回值是 Unit 空类型 */ image.apply { // i 在 0 到 99 的闭区间 for(i in 0 .. 99){ // j 在 0 到 99 的闭区间 for (j in 0 .. 99){ setRGB(i, j, 0xFFFFFF) } } } /* 设置图像中某像素点的颜色值 参数 int x : 像素点的 x 坐标 参数 int y : 像素点的 y 坐标 参数 int rgb : 像素点的颜色值 下面的代码含义是将图像 四个角 和 中心 的像素设置成 红色 */ image.setRGB(0, 0, 0xFF0000) image.setRGB(0, 99, 0xFF0000) image.setRGB(50, 50, 0xFF0000) image.setRGB(99, 0, 0xFF0000) image.setRGB(99, 99, 0xFF0000) /* 将内存中的图像写出到本地 三个参数分别是 : 图像数据 , 图像格式 , 图像输出的 File 对象 */ ImageIO.write(image, "bmp", File("image.bmp")) }
生成的图像展示 :