全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Kotlin 编程三分钟入门

为什么使用Kotlin

项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受。因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人会尝试这样一门小众语言,但是习惯后会发现这些年究竟浪费多少时间在写无用的Java代码了,Kotlin在兼容Java的基础上还能大大提升开发效率。Kotlin有许多特性但对于开发来说,快速适应和学习更为重要,很多时候我们都是在不明白其原因就开始使用的,正如我们不可能把Retrofit原理研究透才使用它。只要它足够稳定成熟,并能有效的提升开发效率都是值得尝试的。鄙人不才,目前使用Kotlin的原因主要是因为它语法简洁,支持lambda表达式,强大的when语法,不用写分号结尾,光是这些就足以让我喜欢Kotlin。至于空安全之类的特性,毕竟服务端数据类型太多null了并没多大感触,这些特性在实际应用中潜移默化的就吸收了,以至于现在遇到几个Java编写的代码,都有些不适应了。

修改说明

突然火了一脸懵逼,Google IO的影响真是不容小觑。避免误人子弟还是修改下比较好,也就把上一篇文章的基础知识也搬迁过来,移除过期链接。

Kotlin 基本语法

先说个学习Kotlin语法的小窍门,将代码用Java写好,然后Code/Conver Java File to Kotlin File转换成Kotlin代码,或者将Java代码复制到Kotlin文件会提示转换也是挺方便的,比较差异很容易就能理解了,一开始难免不适应习惯后相信你一定会喜欢上Kotlin

1). 定义

忘掉Java的那一套写法不然会很不适应的,Kotlin有自己的特性不该被Java的思维所束缚。在Kotlin中常量用val声明,变了用var声明,关键字在前面,类型以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?表示可为空类型(默认空安全)。
常量val延迟加载by lazy{},默认线程安全关闭线程安全lazy(LazyThreadSafetyMode.NONE){},变量var延迟加载lateinit。

//常量数组int[][][] arrs = new int[3][2][1];
val arrs = Array(3) { Array(2) { IntArray(1) } }
//空安全变量
var str: String = "hello"
//可为空字符串变量
var str1: String? = null

2). 条件

if...else 正常使用,不过移除了switch用更强大的when替代,when子式可以是各种返回Boolean的表达式

val x = 7
when (x) {
 in 1..10 -> print("x is in the range")
 in validNumbers -> print("x is valid")
 !in 10..20 -> print("x is outside the range")
 else -> print("none of the above")
}

3). 循环

while 和 do...while 同Java并无区别,for则有很大改变并多出了几个变种

val list = ArrayList<String>()
//递增for (int i = 0; i < list.size(); i++)
for (i in list.indices) {
  print(list[i])
}
//递增for (int i = 2; i < list.size(); i++)
for (i in 2..list.size-1) {
  print(list[i])
}
//递减for (int i = list.size(); i >= 0; i--)
for (i in list.size downTo 0) {
  print(list[i])
}
//操作列表内的对象
for (item in list) {
  print(item)
}
//加强版
for((i, item) in list.witnIndex()) {
  print(list[i])
  print(item)
}
//变种版
list.forEach {
  print(it)
}

list.forEach {
  print(it)
}

list.forEachIndexed { i, s ->
  print(list[i])
  print(s)
}

list.forEachIndexed(object :(Int,String) -> Unit{
  override fun invoke(i: Int, s: String) {
    print(list[i])
    print(s)
  }
})

万能的冒号

在Kotlin中冒号:用万能来称呼绝不为过。常量变量的类型声明,函数的返回值,类的继承都需要它

//val表示常量var表示变量声明
val name: String = "tutu" 
//省略类型说明
var age = "23"
//fun表示函数
fun getName(): String{
  return "tutu"
}
//类继承
class UserList<E>(): ArrayList<E>() {
  //...
}

除此之外还有一个特别的地方也需要它,使用Java类的时候。Kotlin最终会还是编译成Java字节码,使用到Java类是必然的,在Kotlin语法如下

val intent = Intent(this, MainActivity::class.java)

类名::class.java没有为什么就这么写记着就是

我是谁的@

除了冒号另一个重要符号@,想必用到内部类和匿名内部类的地方一定很多,再加上支持lambda语法,没有它谁告诉你this和return指的是哪一个

class User {
  inner class State{
    fun getUser(): User{
      //返回User
      return this@User
    }
    fun getState(): State{
      //返回State
      return this@State
    }
  }
}

偷懒的方法

1). Kotlin特色
Java的getter/setter方法自动转换成属性,对应到Kotlin属性的调用

public class User {
  private String name;
  private String age;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAge() {
    return age;
  }

  public void setAge(String age) {
    this.age = age;
  }
}

这样一个Java类在Kotlin中只需这样调用

val user = User()
//赋值
user.name = "tutu"
user.age = "23"
//取值
val name = user.name
val age = user.age

反之Kotlin的属性自动生成Java的getter/setter方法,方便在Java中调用,同样的定义在Kotlin中

class User {
  var name: String? = null
  var age: String? = null
}

我们的getter/setter方法有时不会这么简单,这就需要自定义getter/setter了,另起一行设置get()/set(value)方法,实现一个Java中常用的单例,这里只为了展示,单例在Kotlin有更简单的方法实现,只要在 package 级别创建一个 object 即可

class User {
  companion object {
    @Volatile var instance: User? = null
      get() {
        if (field == null) {
          synchronized(User::class.java) {
            if (field == null)
              field = User()
          }
        }
        return field
      }
  }

  var name: String? = null
  var age: String? = null
}

自定义getter/setter重点在field,跟我们熟悉所Java的this指代当前类一样,field指代当前参数,直接使用参数名instance代替不会报错但单例就没效果了

2). 字符串模板
在Java中拼接字符串的代码可读性都很差,在Kotlin字符串拼接变得非常简洁,只需用$后面加上参数名,复杂的参数要加上{}

val user = User()
//赋值
user.name = "tutu"
user.age = "23"
//取值
val name = user.name
val age = user.age
var userInfo = "name:${user.name}, age:$age"
//输出结果:name:tutu, age:23

3). lambda
一开始觉得lambda很高级完全看不懂,其实很简单的就是把接口名、方法名和参数类型省掉不写再加个->罢了,明白这点了就不介绍。

新面孔

1). 延迟加载
2). 流程控制

空判断

Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式一种像Java一样抛出空异常,字段后加!!,另一种不做处理直接跳过,字段后加?

//类型后面加?表示可为空
var age: String? = "23" 
//抛出空指针异常
val ageInt = age!!.toInt()
//不做处理跳过
val ages = age?.toInt()

注意事项

内部类和参数默认为public,而在Java中为private
类默认为不可继承(final),想要可被继承要声明为open或abstract
取消了static关键字,静态方法和参数统一写在companion object块
internal模块内可见,inner内部类

以上仅是对使用频率较高的语法总结,学会基本可以阅读Kotlin代码,遇到点问题Google速查一下,至于智能转换、类型推导之类的不用说使用后喜欢自然就会了。当然这只是kotlin的基本语法,方便Java快速熟悉kotlin,深入学习还请阅读相关资料。


# Kotlin  # 三分钟入门  # kotlin 官方学习教程之基础语法详解  # Kotlin 开发环境详解及简单实例  # Kotlin 的注解类详解及实例  # 使用Kotlin开发Android应用的初体验  # Kotlin开发Android应用实例详解  # 使用Kotlin开发Android应用教程  # Kotlin 单例实例详解  # Kotlin 基础教程之反射  # 利用kotlin实现一个饼图实例代码  # 几个  # 不适应  # 为空  # 加载  # 自定义  # 不做  # 转换成  # 抛出  # 跳过  # 移除  # 自己的  # 后加  # 默认为  # 都是  # 我是  # 让我  # 是在  # 太多  # 就能  # 就不 


相关文章: 如何用VPS主机快速搭建个人网站?  建站之星安装后如何配置SEO及设计样式?  网站制作公司排行榜,抖音怎样做个人官方网站  昆明高端网站制作公司,昆明公租房申请网上登录入口?  建站之星安装后如何自定义网站颜色与字体?  代购小票制作网站有哪些,购物小票的简要说明?  名字制作网站免费,所有小说网站的名字?  北京的网站制作公司有哪些,哪个视频网站最好?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  建站之星代理如何获取技术支持?  建站主机是否等同于虚拟主机?  建站之星与建站宝盒如何选择最佳方案?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  大同网页,大同瑞慈医院官网?  建站之星导航配置指南:自助建站与SEO优化全解析  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何确保FTP站点访问权限与数据传输安全?  如何在IIS中新建站点并配置端口与物理路径?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何确认建站备案号应放置的具体位置?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何在宝塔面板中修改默认建站目录?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站主机空间推荐 高性价比配置与快速部署方案解析  宝塔建站后网页无法访问如何解决?  如何在Windows 2008云服务器安全搭建网站?  如何快速搭建FTP站点实现文件共享?  高端云建站费用究竟需要多少预算?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何在服务器上配置二级域名建站?  定制建站流程步骤详解:一站式方案设计与开发指南  如何在云主机上快速搭建网站?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何获取免费开源的自助建站系统源码?  网站专业制作公司有哪些,做一个公司网站要多少钱?  ,交易猫的商品怎么发布到网站上去?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  北京专业网站制作设计师招聘,北京白云观官方网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  如何解决ASP生成WAP建站中文乱码问题?  css网站制作参考文献有哪些,易聊怎么注册?  *服务器网站为何频现安全漏洞?  电商平台网站制作流程,电商网站如何制作?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  已有域名如何免费搭建网站?  C#怎么使用委托和事件 C# delegate与event编程方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。