目录

  • 1. 顶层函数和属性
  • 2. 扩展函数
  • 3. 扩展属性
  • 4. 局部函数

这一节主要介绍顶层函数和属性,扩展函数和属性的原理,理解它们与Java的区别,并提出局部函数的概念

1. 顶层函数和属性

顶层函数不属于任何类,可以理解成Java的静态函数

//在Join.kt文件中
package stringsfun joinToString(...): String { ... }const val UNIX_LINE_SEPARATOR = "\n"

相当于Java代码中的

package strings;
public class JoinKt {public static String joinToString(...) { ... }public static final String  UNIX_LINE_SEPARATOR = "\n";
}

2. 扩展函数

//ExtendsionTextView.kt文件中
//扩展函数定义
fun TextView.isBold() = this.apply { paint.isFakeBoldText = true
}//扩展函数调用
activity.find<TextView>(R.id.course_comment_tv_score).isBold()

等同于下面的 Java 代码:

public final class ExtendsionTextViewKt {//这个类名就是顶层文件名+“Kt”后缀,这个知识上篇博客有详细介绍public static final TextView isBold(@NotNull TextView $receiver) {//扩展函数isBold对应实际上是Java中的静态函数,并且传入一个接收者类型对象作为参数Intrinsics.checkParameterIsNotNull($receiver, "$receiver");$receiver.getPaint().setFakeBoldText(true);//设置加粗return $receiver;//最后返回这个接收者对象自身,以致于我们在Kotlin中完全可以使用this替代接收者对象或者直接不写。}
}

实际上就是一个静态函数,静态函数参数是接受者类型的对象,利用这个对象就可以访问这个对象里面的所有东西,所以相当于扩展了,扩展属性是怎么实现的呢?各位可以先思考一下,再看下面。

3. 扩展属性

//ExtendsionTextView.kt文件中
//扩展属性定义
var TextView.isBolder: Booleanget() {//必须定义get()方法,因为不能在现有对象添加字段,也自然就没有了默认的get()实现return this.paint.isFakeBoldText}set(value) {this.paint.isFakeBoldText = true}
//扩展属性调用
activity.find<TextView>(R.id.course_comment_tv_score).isBolder = true

等同于下面的 Java 代码:

public final class ExtendsionTextViewKt {//get()方法所对应生成静态函数,并且传入一个接收者类型对象作为参数public static final boolean isBolder(@NotNull TextView $receiver) {Intrinsics.checkParameterIsNotNull($receiver, "$receiver");return $receiver.getPaint().isFakeBoldText();}//set()方法所对应生成静态函数,并且传入一个接收者类型对象作为参数和一个需要set的参数public static final void setBolder(@NotNull TextView $receiver, boolean value) {Intrinsics.checkParameterIsNotNull($receiver, "$receiver");$receiver.getPaint().setFakeBoldText(true);}
}

其实就是在get和set方法中加入了接受者类型的对象,利用这个对象就可以访问这个对象里面的所有东西

但是以为扩展函数和属性是静态的,所以是不能够重写的

4. 局部函数

class User(val id: Int, val name: String, val address: String)fun saveUser(user: User) {if (user.name.isEmpty()) {throw IllegalArgumentException("用户名为空不能保存")}if (user.address.isEmpty()) {throw IllegalArgumentException("用户地址为空不能保存")}//保存user
}

把其中检验字段的代码整个成一个验证的局部函数

fun saveUser(user: User) {fun validate(value: String, fieldName: String) {if (value.isEmpty()) {throw IllegalArgumentException("用户${user.fieldName} 为空不能保存") //局部函数能访问外部函数的user对象}}validate(user.name, "名")validate( user.address, "地址")//保存user}

当然,你也可以用将这段局部函数直接放进扩展函数中

fun User.validateBeforeSave() {fun validate(value: String, fieldName: String) {if (value.isEmpty()) {throw IllegalArgumentException("用户$fieldName 为空不能保存")}}validate(name, "名")validate(address, "地址")}fun saveUser(user: User) {user.validateBeforeSave()//保存user}

kotlin学习之函数(二)相关推荐

  1. Kotlin学习之函数

    函数声明 在kotlin中用关键字fun声明函数: fun double(x:Int):Int{ } 其中Int是返回值类型,x指明参数类型是为Int 函数用法 通过传统方法调用函数: val res ...

  2. Kotlin学习笔记(二)——函数操作符内置函数

    小白笔记(持续更新中) 匿名函数 //匿名函数 fun main() {//count()方法 Returns the length of this char sequence.val len=&qu ...

  3. Kotlin学习笔记(二)

    目录 匿名函数 无参匿名函数 带参数的匿名函数 类型推断 定义参数是函数的函数 简略写法 函数内联 函数引用 函数类型作为返回类型 闭包 lambda与匿名内部类 匿名函数 我们在定义函数时,不给他名 ...

  4. Kotlin 学习笔记(二)—— 数据类、密闭类、循环写法以及常用集合操作符

    在上篇笔记中,我们对 Kotlin 的基本类型.关键字.类与对象,以及与 Java 之间互调的内容有了一些认识,这篇笔记来看看 Kotlin 中几种特殊的类,以及集合相关的常用操作. 1. Kotli ...

  5. Kotlin学习笔记-----函数的定义

    函数定义 kotlin的函数其实就是java中的方法, 名字不一样, 定义方式和java中也类似, 函数名(方法名), 参数, 返回值 区别在于, kotlin的函数定义需要加上fun, 这里和jav ...

  6. Kotlin学习2—函数的使用

    1. 普通函数 // 无返回值fun print(msg: String) {println(msg)}// 正常写法,有返回值fun sum(num1: Int = 0, num2: Int = 0 ...

  7. kotlin学习目录

    目录 kotlin学习之基础(一) kotlin学习之函数(二) kotlin学习之类(三) kotlin学习之类的扩展(四) kotlin学习之密封类(五) kotlin学习之嵌套类和内部类(六) ...

  8. Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段

    Kotlin 学习笔记(七)-- Kotlin类与对象之属性与字段 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- ...

  9. Kotlin学习日志(三)控制语句

    一.条件分支 1.1 简单分支 最简单的分支莫过于if-else了吧,Java中相信都用过,那么在Kotlin中又是怎么用的呢?其实也比较类似,来看看吧! 布局文件中: <TextViewand ...

最新文章

  1. python显示无效语法怎么处理-python – 无效语法(对于循环括号/括号)
  2. Python Pickle反序列化漏洞
  3. Hive之DDL数据定义
  4. Rowkey设计_HBase表设计
  5. myeclipse mysql 乱码_MyEclipse与mysql增改查现乱码解决方案绝对有效
  6. BZOJ3527: [Zjoi2014]力 [FFT]
  7. oracle只匹配中文,Oracle 实现 一个关键字 匹配多个 字段
  8. 为什么本地图片都不能直接浏览器_抖音精选答疑解惑!你的视频为什么不能被下载?...
  9. 爬取新笔趣阁排行并保存到mysql_python+selenium爬取微博热搜存入Mysql的实现方法...
  10. linux fcitx-rime导入搜狗词库
  11. 全国省市区三级数据库sql
  12. 钉钉第三方服务商应用ISV应用开发及上架教程
  13. 转载:我的外语学习历程(如何学会十门外语)
  14. 坐上支付宝微信支付巨头的刷脸顺风车
  15. 嵌入式开发——用memtester软件进行内存压力测试
  16. POJ 1088 滑雪(输出对比)
  17. C语言(谭浩强版本,主讲人:小甲鱼)P1-P9
  18. Android Preference详解之初识Preference及Preference系(一)
  19. 中标麒麟桌面版系统(V7.0)安装教程
  20. Python读取多行键盘输入

热门文章

  1. 几种常见的Shell
  2. NAT 及 NAT 打洞技术
  3. [转]I,P,B帧和PTS,DTS的关系
  4. Python中的高阶变量
  5. 音视频技术开发周刊 | 213
  6. 如何使用开源SFU构建RTC云服务
  7. FFmpeg图像处理深度应用
  8. 《Go语言圣经》学习笔记 第八章 Groroutines和Channels
  9. Hadoop之资源调度器与任务推测执行
  10. 使用 pyenv 管理 Python 版本