开发者社区> 韩曙亮> 正文

【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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
10012 0
Java中函数的递归调用
说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的。 public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System.
731 0
JavaScript函数调用规则
JavaScript函数调用规则一 (1)全局函数调用: function makeArray( arg1, arg2 ){     return [this , arg1 , arg2 ]; } 这是一个最常用的定义函数方式。
558 0
使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数
使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数
16 0
JavaScript的5种调用函数的方法
这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! JavaScript,调用函数的5种方法    一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).
639 0
JAVA如何动态加载jar,并调用对应的函数?
JAVA如何动态加载jar,并调用对应的函数?
26 0
JavaScript立即调用的函数表达式
主要参考知乎上这个问题:javascript 匿名函数有哪几种执行方式  长天之云的回答。 ~(function() {//todo})();!(function() {//todo})(); 对于不太熟悉JavaScript的同学来讲,可能会有两个疑问: 1、!(function() {})();前面为什么要加~、!这些符号? 后面的()是执行一个函数,而(function() {})是一个执行表达式,返回一个匿名函数的引用。
618 0
javascript函数的递归调用问题
functin(arg) { var arg2 = ....; arguments.callee(arg2); ... }
523 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20693 0
+关注
韩曙亮
专注 Android 领域
2605
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载