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

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

前言 Kotlin 扩展方法并不是在原类内部进行拓展,通过反编译为Java代码,可以发现,其原理是使用装饰模式,对源类实例操作和包装,其实际相当于我们在 Java定义工具类方法,并且该工具类方法是使用调用者为第一个参数...,然后在工具方法操作该调用者; 理论上来说,扩展函数很简单,它就是一个类成员函数,不过定义在类外面。...接收者类型是由扩展函数定义,接收对象是该类型一个实例 可以像调用成员函数一样去调用这个函数: println("Kotlin".lastChar()) n 从某种意义上说,现在已经为String...Kotlin允许用和导入类一样语法来导入单个函数: import strings.lastChar //星号导入 import strings.* 3.3.2在Java调用扩展函数 其实,扩展函数是静态函数...调用扩展函数,不会创建适配对象或者任何运行时额外消耗。 这使得从Java调用Kotlin扩展函数变得非常简单:调用这个静态函数,然后把接收对象作为第一个参数传进去即可。

1.3K20

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
您找到你想要的搜索结果了吗?
是的
没有找到

Android开发Kotlin扩展函数技巧!

Kotlin扩展函数是一种非常有用功能,可以让我们向现有的类添加新功能,而无需修改类源代码。在本文中,我们将探讨Kotlin扩展函数原理和运用,以及如何在Android开发中使用它们。...什么是扩展函数扩展函数Kotlin一种特殊函数,它允许我们向一个类添加新函数,而无需继承或修改这个类源代码。扩展函数语法非常简单,只需要在函数名前面加上类名,并用点号隔开即可。...不能覆盖已有的函数扩展函数不能覆盖已有的函数。如果类已经存在与扩展函数相同函数签名,那么扩展函数不会被调用,而是优先调用原始函数。...解决方法之一是使用完整限定名称来调用特定扩展函数,明确指定要调用扩展函数。...: view.fadeIn() view.fadeOut() 总结 扩展函数Kotlin一种非常有用功能,可以让我们向现有的类添加新功能,而无需修改类源代码。

24720

Kotlin扩展

Kotlin 扩展 到底是什么?...简单使用: 扩展函数 //要扩展哪个类方法,被扩展类名就是哪个 fun 被扩展类名.扩展函数名(..参数..){ 函数体 } 例如: 在Array扩展一个元素交换方法 fun Array<Int...Kotlin 扩展是一个很独特功能, Java 本身并不支持扩展Kotlin 为了让扩展能在JVM平台上运行,必须做一些独特处理 Kotiin 支持扩展方法和扩展属性 扩展实现机制 Java...但现在 Kotlin 扩展却好像可以动态地为一个类增加新方法,而且不需要重新修改该 类源代码,那 Kotlin 扩展实际情况是怎样呢?难道 Kotlin 可以突破 NM 限制?...Kotiin 扩展本质就是定义了 一个函数,当程序用对象调用扩展方法时, Kotlin 在编 译时会执行静态解析一一就是根据调用对象、方法名找到扩展函数,转换为函数调用 扩展作用主要有两个方面

1.2K30

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

Kotlin 扩展函数 与 JS prototype Kotlin 扩展函数 Kotlin扩展函数功能使得我们可以为现有的类添加新函数,实现某一具体功能 。...扩展函数是静态解析,并未对原类添加函数或属性,对类本身没有任何影响。 扩展属性允许定义在类或者kotlin文件,不允许定义在函数。...(extensions) 在不修改原类情况下, Kotlin能给一个类扩展新功能,无需继承该类,也不用任何设计模式(装饰模式等), Kotlin支持扩展函数扩展属性!...扩展函数是静态解析分发,不是虚函数(即没有多态),调用只取决于对象声明类型! 1.调用是由对象声明类型决定,而不是由对象实际类型决定!...} 2.类成员函数扩展函数-同名同参数: class C { fun foo() { println("member") } } fun C.foo

1.6K20

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

Kotlin 能够扩展一个类新功能而无需继承该类或者使用像装饰者这样设计模式。 这通过叫做 扩展 特殊声明完成。 例如,你可以为一个你不能修改、来自第三方库类编写一个新函数。...Utils.dp2px(100) 来使用, val dp2px = Utils.dp2px(100) 如果用kotlin扩展函数方式来实现,会是怎么调用呢?...在 Android Studio ,我们可以查看 kotlin 文件字节码,然后再 Decompile 为 Java 代码。上面我们为 Person 扩展函数转为Java代码后如下。...扩展不能真正修改他们所扩展类。通过定义一个扩展,你并没有在一个类插入新成员, 仅仅是可以通过该类型变量用点表达式去调用这个新函数,并将自身作为参数传入。...总结 在 Java ,我们要扩展一个类时,常常是继承该类或者用装饰者模式类似的设计模式来实现,Kotlin 扩展函数扩展属性为这种需求提供了一种新思路,并且也可以作为 Utils 类另外一种选择

2.4K40

Kotlin扩展函数 ( 扩展函数声明 | 调用方式 | 与成员函数优先级 | 接收者空值处理 )

扩展函数声明格式 : 扩展函数函数前多了接收者类型 , 函数可以使用 this 调用 接收者类型对象成员 ; fun 接收者类型.扩展函数名 ( 扩展函数参数列表 ) { //扩展函数函数体..., 可使用 this 关键字调用对象成员 } 2 ....调用接收者类型对象成员 : 在函数体中使用 this 关键字 , 可以调用接收者类型对象成员 , 如在下面的示例 , 在类外部扩展函数 , 调用 Student 对象 name 成员 ,...扩展函数本质 : 为 接收者类型 定义扩展函数 , 并没有真正再改类插入新成员函数 , 仅能通过 接收这类型对象变量.扩展函数() 方式来调用这个函数 ; III ....空值处理两种类型 : ① 非空类型 : 这是 Kotlin 默认类型 , Student 类型是非空类型 , 不能被赋值为 null ; ② 可空类型 : 在类型名称后使用 ?

68430

Kotlin扩展函数知识点

Kotlin扩展函数很显然能够优雅解决这种问题。...不定义在类,也就是类外部 可以看到上面反编译后扩展函数就是这种类型,被static,public,final修饰方法会有这个特征:在同一个包是可以共享这个扩展函数也就是可以调用到这个扩展函数...其他包里面如果也想使用这个函数就可以import这个包这个函数即可。 定义在类,也就是类内部 这时候诡异事情出现了,扩展函数无法被调用。...这样似乎看起来没有什么问题,但是当我们需要扩展三方类静态函数时,如果其没有用Kotlin伴生对象指定静态方法/变量,那么该方案将无法使用,只能用实例去调用。...函数优先级 有没有想过这样一种情况:就是这个类扩展函数名之前在这个类中就已经存在了,那么调用这个方法时,会调用扩展函数还是之前类定义好方法。

28930

Kotlin扩展函数 ② ( 扩展属性 | 为可空类型定义扩展函数 | 使用 infix 关键字修饰单个参数扩展函数简略写法 )

文章目录 一、扩展属性 二、可空类扩展 三、使用 infix 关键字修饰单个参数扩展函数简略写法 一、扩展属性 ---- 上一篇博客 【Kotlin扩展函数 ( 扩展函数简介 | 为 Any 超类定义扩展函数...---- 之前讲定义扩展函数 , 扩展属性 , 都是为 非空类型 定义 , 如果要为 可空类型 定义扩展函数 , 则需要在 扩展函数 处理时 , 要多考虑一层 接收者 this 为空 情况...; 注意下面的调用细节 : 如果定义 扩展函数 是 为 非空类型定义 , 可空类型变量 想要调用扩展函数 , 在调用时使用 " ?....非空类型扩展函数 如果定义 扩展函数 是为 可空类型定义 , 可空类型变量 想要调用扩展函数 , 在调用时直接使用 " . " 进行调用即可 ; 可空类型实例对象.可空类型扩展函数 代码示例...infix 关键字修饰 单个参数扩展函数 : 接收者 函数函数参数 也可以使用 传统方式调用 : 接收者.函数名(函数参数) Map 创建 Pair 实例对象 to 函数 , 就是

1.9K30

学习PHP任意精度扩展函数

学习PHP任意精度扩展函数 今天来学习是关于数学方面的第一个扩展。对于数学操作来说,无非就是那些各种各样数学运算,当然,整个程序软件开发过程,数学运算也是最基础最根本东西之一。...如果想要精确地计算,就可以使用 bc 扩展相关函数,也就是我们最后演示那个 bcmul() 函数。它作用就是第一个参数乘以第二个参数,获得结果也是高精度,也就是精度准确结果。...bcpow() 是乘方计算,对应是普通函数 pow() 函数,同样在这里我们在普通函数计算 1.1 2 次方出现了精度问题,使用 bcpow() 我们显示 30 位小数也没有找到精度异常...总结 今天内容除了 bc 相关计算函数之外,也讲到了精度问题这个各种语言都存在问题。其实说实话,我们在日常开发,对于金额这类带小数点数据,最好都是以分为单位进行存储。...测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/7.学习PHP任意精度扩展函数.php 参考文档

90530

学习PHPiconv扩展相关函数

学习PHPiconv扩展相关函数 想必 iconv 这个扩展相关函数大家多少都接触过,做为 PHP 默认扩展它已经存在了很久,也是我们在操作字符编码时经常会使用函数。...不过除了 iconv() 这个函数外,你还知道它其它函数吗?今天,我们就来学习一下 iconv 扩展各种好玩函数。...iconv 设置及获取信息 首先,就是我们可以设置 iconv 扩展默认定义输出和输出字符编码格式。...当然,现在大多数情况下我们会使用 MB 库扩展相关函数来处理这种问题,不过 iconv 也为我们提供了几个用于字符串操作函数。...测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/2.学习PHPiconv扩展相关函数.php

1.1K40

讨论覆盖函数函数扩展复杂性

作者:Umang Bhaskar,Gunjan Kumar 摘要:覆盖函数是子模块函数重要子类,可用于机器学习,博弈论,社交网络和设施位置。我们研究了覆盖函数函数扩展复杂性。...也就是说,给定由[m]子集族和每个点值组成部分函数,​​是否存在在[m]所有子集上定义扩展该偏函数覆盖函数?...偏函数扩展以前是针对其他函数类进行研究,包括布尔函数和凸函数,并且在许多领域都很有用,例如在学习这些函数类时获得边界。...我们证明了确定偏函数对覆盖函数扩展性是NP完全,在该过程建立了一个多项式大小扩展性证书。硬度也为我们提供了学习覆盖功能下限。然后,我们研究两种近似扩展自然概念,以解释数据集中错误。...我们显示了近似概念上限和下限。在第二种情况下,我们获得了非常狭窄边界。

78660

Kotlin函数

函数还可以用中缀表示法调用,当他们是成员函数扩展函数,只有一个参数,用 infix关键字标注 // 给 Int 定义扩展 infix fun Int.shl(x: Int): Int { …… } /.../ 用中缀表示法调用扩展函数 1 shl 2 // 等同于这样 1.shl(2) 可变数量参数和星操作符 可变参数vararg 使用关键字vararg来修饰可变参数。...这里等待后面具体来看什么时候非内联 在 Kotlin ,我们可以只使用一个正常、非限定 return 来退出一个命名或匿名函数。...在上面第 4 行代码,less 作为一个函数使用:通过传入两个 T 类型参数来调用。 如上所写是就函数类型,或者可以有命名参数,如果你想文档化每个参数含义的话。...可以实现dsl风格代码全靠它 Kotlin 提供了使用指定 接收者对象 调用函数字面值功能。 可以调用该接收者对象上方法而无需任何额外限定符,可以任意调用接受者方法和属性。

2.3K40

Python如何在main调用函数函数方式

一般在Python函数定义函数是不能直接调用,但是如果要用的话怎么办呢?...一般情况下: def a():#第一层函数 def b():#第二层函数 print('打开文件B') b()#第二层函数直接调用 结果显示: Traceback (most recent...这时候只要在函数a返回b函数函数名,就可以使用b函数了。...() 结果: 打开文件B 如果需要调用同一个函数多个函数: 这里先设置了一个全局变量Position_number,然后在a()说明这个全局变量,再通过全局变量改变,来调用a()不同函数...以上这篇Python如何在main调用函数函数方式就是小编分享给大家全部内容了,希望能给大家一个参考。

9.1K30

浅谈Kotlin函数

本文简单谈下Kotlin函数,包括表达式函数体,命名参数,默认参数,顶层函数扩展函数,局部函数,Lambda表达式,成员引用,with/apply函数等。...先来看下函数调用,相比Java, Kotlin可以类似于JavaScript带命名参数进行调用,而且可以不用按函数声明顺序进行调用,可以打乱顺序,比如下面: joinToString(separator...4.顶层函数 不同于Java函数只能定义在每个类里面,Kotlin采用了JavaScript 做法,可以在文件任意位置处定义函数,这种函数称为顶层函数。...5.扩展函数 扩展函数是类一个成员函数,不过定义在类外面 扩展函数不能访问私有的或者受保护成员 扩展函数也是编译成静态函数 所以可以在Java库基础上通过扩展函数进行封装,假装好像都是在调用Kotlin...,这样就可以直接通过list进行调用, 在扩展函数里面照常可以使用this,这里this就是指向接收者对象,在这里就是list。

2.5K20

Kotlin内联函数

Kotlin内联函数还是挺好玩 为什么需要内联函数? lambda 表达式会被正常地编译成匿名类。这表示每调用一次 lambda表达式,一个额外类就会被创建。...内联函数使用 inline 修饰符标记,内联函数在 被使用时候编译器并不会生成函数调用代码,而是使用函数实现真实代码替换每一次函数调用 内联函数如何运作?...当一个函数被声明为 inline 时,它函数体是内联一一换句话说,函数体会被直接替换到函数调用地方,而不是被正常调用。...Int、Long、Double都继承自Number,但是,如果我们在调用上面的函数时,传入了Array,这样是会报错!!...因为 kotlin调用函数时要求参数类名必须完全一致!! 对于上面的函数,如果我们想既可以接收 Array, 也可以接收Array, 那么就可以定义一个具体化类型参数内联函数.

1.5K20

让PHP能够调用C函数-FFI扩展

让PHP能够调用C函数-FFI扩展 在大型公司,一般会有很多编程语言配合。比如说让 Java 来做微服务层,用 C++ 来进行底层运算,用 PHP 来做中间层,最后使用 JS 展现效果。...什么是 FFI FFI , Foreign Function Interface,外部函数接口。这个扩展允许我们加载一些公共库(.dll、.so),其实也就是可以调用一些 C 数据结构及函数。...它已经是随 PHP 源码发布一个扩展了,在编译时候可以加上 --with-ffi 来直接编译到 PHP 程序。...设定为 "true" 将使得这个扩展在任何环境下都启用。 使用 FFI 调用 C 函数 接下来,简单地看一下它是如何调用 C 函数。...但是请注意哦,FFI 调用 C 函数并没有 PHP 本身去调用效率高。比如这种 pow() 函数,使用 PHP 自身效率更好。

1.8K12

何在Go函数得到调用函数名?

原文作者:smallnest 有时候在Go函数调用过程,我们需要知道函数被谁调用,比如打印日志信息等。例如下面的函数,我们希望在日志打印出调用名字。...2我是 main.Bar, 谁又在调用我可以看到函数在被调用时候,printMyName把函数本身名字打印出来了,注意这里Caller参数是1, 因为我们将业务代码封装成了一个函数。...首先打印函数调用名称 将上面的代码修改一下,增加一个新printCallerName函数,可以打印调用名称。...0 代表当前函数,也是调用runtime.Caller函数。1 代表上一层调用者,以此类推。...0 代表 Callers 本身,这和上面的Caller参数意义不一样,历史原因造成。 1 才对应这上面的 0。 比如在上面的例子增加一个trace函数,被函数Bar调用

5.2K30

关于Kotlin扩展函数与lambda上下文

通常我们在写一个扩展函数,如果传入一个lambda表达式大概是下面这样 inline fun T.apply(block: () -> Unit) { block() } 复制代码 这个时候它上下文是谁呢...在扩展方法内部,这个方法上下文其实就是这个T,也就是调用这个方法对象,所以this == T,这一点很明显。 那么在外部使用时候,如下代码呢?...} 复制代码 注意,这里虽然调用了apply方法,但是后面的代码块{}实际上是block: () -> Unit这个lambda简写,也就是说我们是处于一个lambda表达式,所以它上下文自然就是这段代码外部上下文...但是我们知道Kotlin自己带apply方法是可以在这个lambda中去拿到调用对象,然后去做一些配置操作,也就是说是可以把这个lambda上下文变成调用。怎么做呢?...其实很简单,将apply那个lambda也变成调用一个扩展方法就行了。像下面这样写。

29920
领券