140-手写事件变换操作符之Rx操作符总结(Derry老师)_哔哩哔哩_bilibili
视频链接:导学_哔哩哔哩_bilibili
一、环境搭建
1、工具安装与环境配置
官网地址: Download Android Studio & App Tools - Android Developers
安装步骤就不一一介绍了
新建过程如下(新建一个多tab的):
然后就会自动下载依赖库了
2、介绍项目工程结构
项目可以选择project模式(可以现实所有的文件), 默认的android模式只会显示安卓相关的文件
模块app下面的gradle文件的作用:
根目录下gradle文件的作用: 声明在编译过程中需要使用到的一些插件
3、实践:构建出第一个app
(1)构建方法:
(2)找到安装包
二、开发语言
函数类型&隐式返回
匿名函数不要写return, 最后一行就是返回值
只要匿名函数是一个入参的, 就带有一个it
上面的方式需要手动写定返回值, 下面的可以自动推断返回值
匿名函数的类型推断
lambda表达式学习
在函数中定义参数是函数的函数
之前用Java的方式
函数内联学习
如果函数使用lambda作为参数, 就需要声明成内联, 如果此函数, 不是用内联, 在调用端会生成多个对象来调用造成性能损耗.如果此函数使用内联,相当于C++ #define 宏定义 宏替换.会把代码替换到调用处, 调用处没有任何函数开辟, 对象开辟的损耗.
小结: 如果函数使用lambda, 尽量使用inline关键字, 这样内部会做优化, 减少函数开辟、对象开辟的损耗.
函数引用
lambda属于函数类型的对象需要把普通函数变为函数类型的对象-函数引用, 所以上面main函数里面的调用需要改为
函数类型的对象, 也可以通过先接收这种
kotlin函数类型作为返回类型
匿名函数与具名函数
只有一个参数可以使用it
匿名函数,没有名字
具名函数: 有具体的名字
使用Java实现具名和匿名函数
匿名函数
具名函数
kotlin语言的可控性特点
kotlin语言在编译期间就控制了空指针异常
第一种情况: 默认是不可空类型, 不能随意给null, 不能是非空类型String的值
第二种情况: 声明时指定为可空类型: 有?可以给null
kotlin的安全调用操作符
capitalize() 让字符串的首字母变为大写
使用带let的安全调用
kotlin中的非空断言符操作特点
!!不管是不是null都执行(那么为null会崩溃)
如果100%能保证是有值的才能使用断言!!
对比使用if判断null值的情况
kotlin空合并操作符
异常处理与自定义异常特点
语言的先决条件函数
substring
split操作
replace完成加密解密操作
加密操作:
解密操作:
==与===比较操作
name1和name3常量池的位置不同, 所以为false ;name1和name2的引用一样所以为ture(指向常量池中的同一个位置)
字符串遍历操作
不想使用it可以定义一个参数覆盖it
数字类型的安全转换函数
以后字符串有整型相关的转换尽量使用toIntOrNull()
Double转Int与类型格式化
apply内置函数
apply一般使用他的链式调用, 不是返回值的方式
let内置函数
内置函数的总结:
run内置函数
匿名的方式写
with内置函数
also内置函数 每个区间做的事情和返回值没有关系
takeIf内置函数
小结: 一般大部分情况下, 都是takeIf + 空合并操作符 = 一起使用
takeUnless
三、集合
List创建与元素获取
可变List集合
mutator函数学习
List集合遍历
解构语法过滤元素
用_内部可以不接收赋值,节约一点性能
Set创建与元素获取
可变Set集合
集合转换与快捷函数
数组类型
Map的创建
读取Map的值
遍历Map学习
可变Map集合学习
语言的定义类和Filed关键字学习
计算属性与防范竞态条件
防范竞态条件: 当你调用成员可能为null, 可能为空值就必须采用防范竞态条件, 这个是KT编程的规范化
主构造函数
p.show()
主构造函数里定义属性
次构造函数: 先调用主构造之后再调用次构造
构造函数中默认参数学习
初始化块学习
临时类型在init中可以使用,但是在普通函数中不能直接使用
构造初始化顺序
延迟初始化lateinit: 用的那一刻再去加载, 使用之前去手动的加载
惰性初始化by lazy
饿汉式没有任何懒加载的特点
懒加载
初始化陷阱一: init函数和类成员是同时执行的关系, 所以下面的顺序会导致程序崩溃
初始化陷阱二: new的时候调用主构造函数, 主构造函数没有获取到info所以会导致程序崩溃
初始化陷阱三
修正:
语言的继承与重载的open关键字: kotlin里面默认都是private的, 需要用open打开, 子类才能继承
类型转换
智能类型转换
Any超类学习: 超类(kotlin中任何类都会隐式继承any类)
对象声明学习
对象表达式学习
具名实现
Java实现 KT[对象表达式]
Java最简洁的方式
伴生对象学习: 凡是写到companion里面的都是静态的
嵌套类学习
内部类: 默认情况下kt内部类不能访问外部的类, 需要增加修饰符inner成为内部类才能访问外部类
嵌套类
数据类学习
copy函数学习
解构声明学习
运算符重载
枚举类学习
枚举类定义函数学习
代数数据类型
密封类学习: sealed
数据类使用条件
语言的接口定义
语言的接口的默认实现
抽象类学习 和java相同
定义泛型类学习: 传什么类型都会做类型推断
泛型函数
泛型变换实战
map函数模仿RXjava操作
泛型类型约束学习
限定为Person之后: 下面截图注释掉的就都有问题会报错
vararg关键字(动态参数)
[]操作符学习
out-协变学习: 想要所有的泛型都能被修改 就用in, 想要不被修改用out
协变: 父类泛型声明处, 可以接收子类泛型具体处
用Java实现in-逆变学习
Java实现
使用in和out
out
reified关键字
定义扩展函数
超类上定义扩展函数: 超类的扩展函数在任何地方都可以调用(谨慎使用)
泛型扩展函数
string类型输出长度
显示调用时间 显示调用者类型
标准函数与泛型扩展函数
扩展let函数
扩展属性
示例:
可控类型扩展函数
infix关键字
定义扩展文件
文件一
文件二 结果:
重命名扩展学习
apply函数详解
DSL学习: 定义一个规则进行输入输出
applyFile函数
main函数中进行 调用
变换函数-map
就是把匿名函数最后一行的返回值加入一个你的集合, 新集合的泛型是R,并且返回新集合
变换函数-flatMap
输出 list.flatmap
过滤函数-filter
介绍filter
返回给map和返回给flatmap的效果是不同的
合并函数-zip
使用函数式编程
Java的写法
kotlin方式
kotlin函数式编程真牛逼👍
互操作性和可控性
Java和kotlin的交互
Java文件
kotlin文件
单例模式
饿汉式
Java版本
kotlin版本
懒汉式: 要用的时候再加载
Java
kotlin
懒汉式实现+安全管理版本(上面的方式多线程就会出现问题)
同步锁的方式
Java
kotlin 双重校验安全
Java 同步锁+同步代码块
kotlin lazy的模式实现
注解@JvmName与Kotlin: 在编译器环节修改名字,必须写在包名的外面
Java 版本
主函数中调用 修改名字
main函数
注解@JvmField与kotlin : 背后会剔除私有代码成员, 可以直接调用
注解@JvmOverloads与kotlin: kotlin代码加上这个注解后Java可以用kotlin的默认参数
注解@JvmStatic与kotlin的关系: 源码会在外面封装一个函数, 使Java可以直接调用ktlin参数
java调用kotlin中的函数
也可以使用注解的方式,可以达到和kotlin同样的效果直接调用
手写事件变换操作符之create、中转站、map
手写事件变换操作符之总结与简化代码
结果流向最后
手写事件变换操作符之observer
结果流向最后再显示出来(对中转站进行函数扩展)
手写事件变换操作符之Rx操作符总结
android kotlin的空检测机制
android kotlin的cal与var类型推断
android kotlin的函数 class里面的函数叫函数,外面fun打头的也叫函数
unit类型可以写也可以不写