kotlin学习之函数(二)
目录
- 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学习之函数(二)相关推荐
- Kotlin学习之函数
函数声明 在kotlin中用关键字fun声明函数: fun double(x:Int):Int{ } 其中Int是返回值类型,x指明参数类型是为Int 函数用法 通过传统方法调用函数: val res ...
- Kotlin学习笔记(二)——函数操作符内置函数
小白笔记(持续更新中) 匿名函数 //匿名函数 fun main() {//count()方法 Returns the length of this char sequence.val len=&qu ...
- Kotlin学习笔记(二)
目录 匿名函数 无参匿名函数 带参数的匿名函数 类型推断 定义参数是函数的函数 简略写法 函数内联 函数引用 函数类型作为返回类型 闭包 lambda与匿名内部类 匿名函数 我们在定义函数时,不给他名 ...
- Kotlin 学习笔记(二)—— 数据类、密闭类、循环写法以及常用集合操作符
在上篇笔记中,我们对 Kotlin 的基本类型.关键字.类与对象,以及与 Java 之间互调的内容有了一些认识,这篇笔记来看看 Kotlin 中几种特殊的类,以及集合相关的常用操作. 1. Kotli ...
- Kotlin学习笔记-----函数的定义
函数定义 kotlin的函数其实就是java中的方法, 名字不一样, 定义方式和java中也类似, 函数名(方法名), 参数, 返回值 区别在于, kotlin的函数定义需要加上fun, 这里和jav ...
- Kotlin学习2—函数的使用
1. 普通函数 // 无返回值fun print(msg: String) {println(msg)}// 正常写法,有返回值fun sum(num1: Int = 0, num2: Int = 0 ...
- kotlin学习目录
目录 kotlin学习之基础(一) kotlin学习之函数(二) kotlin学习之类(三) kotlin学习之类的扩展(四) kotlin学习之密封类(五) kotlin学习之嵌套类和内部类(六) ...
- Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段
Kotlin 学习笔记(七)-- Kotlin类与对象之属性与字段 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- ...
- Kotlin学习日志(三)控制语句
一.条件分支 1.1 简单分支 最简单的分支莫过于if-else了吧,Java中相信都用过,那么在Kotlin中又是怎么用的呢?其实也比较类似,来看看吧! 布局文件中: <TextViewand ...
最新文章
- python显示无效语法怎么处理-python – 无效语法(对于循环括号/括号)
- Python Pickle反序列化漏洞
- Hive之DDL数据定义
- Rowkey设计_HBase表设计
- myeclipse mysql 乱码_MyEclipse与mysql增改查现乱码解决方案绝对有效
- BZOJ3527: [Zjoi2014]力 [FFT]
- oracle只匹配中文,Oracle 实现 一个关键字 匹配多个 字段
- 为什么本地图片都不能直接浏览器_抖音精选答疑解惑!你的视频为什么不能被下载?...
- 爬取新笔趣阁排行并保存到mysql_python+selenium爬取微博热搜存入Mysql的实现方法...
- linux fcitx-rime导入搜狗词库
- 全国省市区三级数据库sql
- 钉钉第三方服务商应用ISV应用开发及上架教程
- 转载:我的外语学习历程(如何学会十门外语)
- 坐上支付宝微信支付巨头的刷脸顺风车
- 嵌入式开发——用memtester软件进行内存压力测试
- POJ 1088 滑雪(输出对比)
- C语言(谭浩强版本,主讲人:小甲鱼)P1-P9
- Android Preference详解之初识Preference及Preference系(一)
- 中标麒麟桌面版系统(V7.0)安装教程
- Python读取多行键盘输入