网站首页 > 博客文章 正文
导读:自从2017年google宣布kotlin成为android开发第一语言后,很多android开发者转战kotlin。一般来讲,转换一门编程语言,有人欢喜有人忧,我们经常会看到好多程序员论坛评论 [学不动了],但实际上,那些想在IT行业往上爬的程序员早早的拥抱新技术。今天我们就来看下kotlin这门语言到底有多大变化。
提醒:篇幅太长,阅读大概需要10~13分钟
java转kotlin
目前kotlin最新稳定版1.3.72,已经相当完善了,这个时候去学习,也有很多资料,比如kotlincn,文档翻译很及时,学习起来也就轻松很多了。接下来,我们看下java转kotlin的基本用法
- 变量声明
比如定义字符串a
java:
String a = "string";
kotlin:
var a : String = "string"
kotlin特有:
var a : String? = null // 可空
var a : String // 不可控,必须赋值,否则编译报错
因此,大家可以看出来,kotlin从语法、编译上已经杜绝了类型安全问题,按照kotlin的写法可以避免很多java中遇到的问题。
- 类声明
比如定义个Student
java:
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
kotlin:
data class Student(val name: String, val age: Int)
可以看到,代码量只有一行,非常简洁
- 方法声明
比如定义个main函数
java:
public static void main(String[] args) {
System.out.println(")
}
kotlin:
fun main(args: Array<String>) {
println("Hello World")
}
这个差距不大
- 接口定义
我们来看下例子
java:
interface MyInterface {
void bar()
default void foo() { // java8 开始支持
// 可选的方法体
}
}
kotlin:
interface MyInterface {
val prop: Int // 抽象的
fun bar()
fun foo() {
// 可选的方法体
}
}
区别:kotlin声明接口可以定义属性
- 访问修饰符
访问修饰符基本差不太多,也比较简单
java:
支持default、private、public、protected
kotlin:
支持private、 protected、 internal 和 public,默认public
- 匿名类
比如在android中给view设置点击事件
java:
// 方式一
btn.setOnClickListener(new View.OnClickListener(){
void onClick(View v) {
}
});
// 方式二(需要java8支持)
btn.setOnClickListener(view -> {
});
kotlin:
// 方式一
btn.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
}
})
// 方式二
btn.setOnClickListener { view ->
}
kotlin常用特性
- 属性委托
- 延迟委托:by lazy { }
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
上面这个例子,当你使用lazyValue的时候才会执行大括号的内容,也就是打印computed!并返回Hello。在android中常用视图的延迟加载,对性能的调优有很大帮助。
- 观察委托
class User {
var name: String by Delegates.observable("init value") {
prop, old, new ->
println("$old -> $new")
}
}
这个特性类似vue的观察者模式
- 别名
typealias MyHandler = (Int, String, Any) -> Unit
- 高阶函数
熟悉js的同学,这个就很好理解了,本质就是把函数当做参数传递
// 声明
fun play(cb: () -> Unit) {
...
}
// 调用
play {
}
- super
支持指定父类
class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
override fun bar() {
super<B>.bar()
}
}
kotlin常用集合操作
- list
java:
List<String> list = new ArrayList<String>();
kotlin:
var list = mutableListOf<String>()
- map
java:
Map<String,Object> map = new HashMap<String,Object>();
kotlin:
var map = mutableMapOf<String, Any>()
kotlin增强语法糖
- 字符串模板
var a = "hello "
var b = "kotlin"
var str = "$a$b" // hello kotlin
var str = """
$a$b
"""
- 属性访问控制
共有getter,私有setter
var isPlay: Boolean = false
private set
- 常用内联函数:let、apply、also
kotlin中最常用的就是代码块,也就是{}语法,比如
play {
}
这种,让代码看起来简单了不少。
let:用来避免非空判断
var name: Stirng? = null
name?.let { name ->
// 这里name就一定不为null
}
apply:用来函数内部处理,处理完返回函数本身
TextView(context).apply {
// 这里接收的是this,因此直接调用TextView的属性和方法即可
text = "Hello"
}
also:
TextView(context).also {
// 这里接收的是it
it.text = "Hello"
}
kotlin在android中常犯的错
- 获取java class
MainActivity::class.java
- this使用
this@MainActivity
kotlin自定义扩展
比如:判断多个值非空
inline fun <R> notNull(vararg args: Any?, block: () -> R) {
when (args.filterNotNull().size) {
args.size -> block()
}
}
总结
kotlin是一门基于JVM的新语言,100兼容现有JVM任何库,因此受到广泛尝试,android因为google的原因,超过一半的开发者已经在使用。当然kotlin提供了很多新特性,无形增加了学习成本,但是我相信在学习过程中,你会慢慢喜欢上她的。
猜你喜欢
- 2024-09-10 全新版Jetpack进阶提升,系统性落地短视频App(完结)
- 2024-09-10 Android开发新选择:Kotlin(kotlin android开发教程)
- 2024-09-10 高兼容低成本,开箱即用的首页性能优化方式被我们找到了
- 2024-09-10 使用Kotlin实战一个BaseActivity并制作一个登录页
- 2024-09-10 Kotlin 1.2 Beta 发布,来看看新特性!
- 2024-09-10 Android自定义控件(高手级)——JOJO同款能力分析图
- 2024-09-10 Spring Boot 自定义Jackson ObjectMapper
- 2024-09-10 android studion 使用kotlin操作ListView代码量的减少
- 2024-09-10 使用Kotlin实战一个Android架构中的MVP模式,简单实用
- 2024-09-10 使用kotlin实现沉浸式状态栏(kotlin ui框架)
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)