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接口:

相关推荐
碳苯1 分钟前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
wclass-zhengge13 分钟前
数据结构篇(绪论)
java·数据结构·算法
何事驚慌13 分钟前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.14 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐15 分钟前
C++:静态成员
开发语言·c++
TJKFYY16 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
kylinxjd17 分钟前
spring boot发送邮件
java·spring boot·后端·发送email邮件
杰哥在此25 分钟前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
小白学大数据25 分钟前
User-Agent在WebMagic爬虫中的重要性
开发语言·爬虫·http
OLDERHARD25 分钟前
Java - MyBatis(上)
java·oracle·mybatis