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

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

文章目录

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"))
}



生成的图像展示 :


image.png

目录
相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
29天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1天前
|
安全 Java 程序员
|
5天前
|
Java API Apache
ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
23 11
|
6天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
9天前
|
存储 安全 Java
说说Java 8 引入的Stream API
说说Java 8 引入的Stream API
12 0
|
9天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
10天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
11天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
13天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
46 1