Java转Kotlin

Kotlin 是一种静态编程语言

2011JetBrains开始开发Kotlin,用于多平台应用(能脱离虚拟机,直接编译成可以在win,mac,linux运行的二进制代码)

2017获得谷歌官方支持

语法简洁(减少了大量的样板代码,语法糖),提供了空安全、协程、函数式编程(高阶函数和 Lambda 表达式)、函数扩展等特性,并且与Java有良好的互操作性。缺点是相对年轻,缺少一些成熟的库和工具。

1.声明变量、常量

val声明只读变量

类型推断:

一些能够自己推断出类型。就不用写类型,比如 var age=5

常量需要写到函数外,否则报错:

复制代码
const val MAX1=1

因为这些编译时就确定,放到函数里面,函数要执行了才确定。所以放到外面。

放到伴生对象里面也行,伴生对象类似静态。

2.数据类型

首字母都大写了,都是对象

Int , -21474836482147483647

Java有基本和引用数据类型。

Kotlin只有引用,但是最后编译器会改为基本数据类型,提高效率。

3.分号没了

4.let with run apply also takeif takeunless

let 传入it,返回代码块结果

also 传入it,返回this

with 传入this,返回代码块结果

run 传入this,返回代码块结果

apply 传入this,返回this

takeif ,类似if。函数体内要返回ture或者false,类似if里面的ture或者false。如果true,执行后面

takeUnless,和上面类似,但是判断里面是false,才执行后面

5.@JvmOverloads等

几个都是用来java调用kotlin的?

@JvmOverloads

在有默认参数值的方法中使用@JvmOverloads注解,则kotlin会暴露多个重载方法。

参数都没有默认值,写了这个注解,那还是只有一个方法。

@JvmField

把类里面的成员变量暴露出来,不用get也能访问

@JvmName

改个别名

@JvmStatic

类型JvmField,暴露伴生对象

@Throws

解决Java和Kotlin的异常检查的差异

6.查看字节码

双击shift,输入show kotlin bytecode

Tools -> Kotlin -> Show Kotlin Bytecode。

7.条件语句

when

8.在什么范围 range

9.箭头符号 ->

箭头符号 -> 在 Kotlin 中扮演了多种角色,包括定义 Lambda 表达式、函数类型

val a: (Int) -> Int = { x -> x * x }

fun performOperation(x: Int, operation: (Int) -> Int): Int { return operation(x) }

10.函数声明

可以给函数默认参数

还有具名函数参数,就是给具体名字来写每个参数。就可以不按顺序了。

Unit类似void,它也是一个类型,不是 "没有类型"

TODO,不会只有提示,会直接异常中断,返回Nothing类型

函数名加反引号,避免两边语言关键字不一样导致取名取到对方不识别的函数名的问题,就可以相互愉快的访问了

给函数参数传 _ 下划线,表示不赋值

11.list set map

list

里面可以存任意类型

listOf可以创建,也可以直接大括号

有提供getOrElse getOrNull等函数

MutableList 是可变的list

两种列表可以相互转换

Set

无序不能重复

也有可变和不可变

Map

mapOf来创建

也有可变和不可变

12. 类

默认都是不可继承,需要继承,加open

默认给成员变量,生成get set

可以修改get set,用到field关键字。这个代表这个变量的引用?每个变量都有一个field

主构造函数:

直接写在类后面小括号里面,那只能传参数,不能有代码了

次构造函数:

用constructor

次构造必须要调用主构造才行。

初始化顺序:

init创建对象就会调用

lateinit,延迟初始化:

类似dart 的late。

惰性初始化:

config被用的时候,才会调用后面的函数

13.其他

解构 方便一次返回多个值
委托 ab类继承c类。 原来各自构造。 可以通过d类,来管理ab,都用他来构造

reified 知道泛型类型。

infix 语法糖。适用单个参数的函数。在函数前面加infix关键字,使用的时候就把 xxx.to(yyy) 变为 xxx to yyy
zip 合并两个集合,返回一个新集合
fold 合并
map 变换函数

返回:

flatMap

返回123456

filter 过滤

返回 Jack Jimmy

14.协程

是对线程封装的api,方便调用。单个线程内,性能一样

复制代码
runblocking,launch,async多种方法
复制代码
CoroutineScope
复制代码
复制代码
async和await结合使用
复制代码
suspend 挂起。从当前线程脱离,进入另外一个线程。 在当前线程,就是挂起的状态。

15.Jetpack

官方提供的架构,框架

16. build.gradle.kts

用kotlin语言写的,用起来更方便

17.databinding

viewbinding 只是帮忙写了findViewById而已。 layout布局里面不需要做任何变动

databinding 写了findViewById,layout里面需要 layout和data的标签,默认只有初始数据设置了进去

observablefield 实现了数据变化了,edittext里面数据也一起变化 。用了它专门的set方法,set里面帮忙做了notifyChange。实现了数据Bean->页面的单向绑定

复制代码
userViewModelByOb.nameOnlyOB.set("我是nameOnlyOB  更改后")

继承BaseObservable 和上面observablefield 实现的功能类似

加上等号 ,edittext的内容变化了,会同步改变了数据上面。实现页面-->Bean的数据单向绑定

livedata 多了一个observe方法,用LiveData包裹的数据String,可以监听它变化,变化了可以在observe里面做操作。Activity里面没有owner,AppCompatActivity才有

18.lifecycle

当我们自己写的一个类,需要在activity各个生命周期做操作时,这样代码就比较零散。

可以这样做:

然后activity添加一下观察者

这样就能拥有了生命周期监听能力。

另外还有这种方式,实现DefaultLifecycleObserver接口:

相关推荐
工业3D_大熊1 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
喵叔哟4 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk10 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME10 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
起名字真南28 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
爬山算法34 分钟前
Maven(28)如何使用Maven进行依赖解析?
java·maven
tyler_download40 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~40 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#41 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透42 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc