Kotlin基础(Kotlin系列之一)

kotlin语言已经在慢慢成为Java的替代语言,早在 2017Google开发者大会 的时候就进入大众的视野,从此流行起来。自己因为个人原因一直没有完整的学习,趁着这个机会把 Kotlin 认真啃一遍(主要参考《Kotlin实战》这本书籍),希望以此博客记录自己的学习过程。

本文的目录如下:
一、Kotlin 的简介;
二、Kotlin 的基础语法;

Kotlin 简介

目的

Kotlin 从被创建之初的目的就是用来替代 java,而且在使用上比java更简洁、安全和务实,且可以与java互相调用。 关于 Kotlin 语言的这些特点可以在接下来的介绍和使用中慢慢了解。

KotlinJava 的异同

  • KotlinJava 百分百兼容,在任何使用 Java 语言的地方都可以使用 kotlin。在 AndroidStudio 中复制 Java 代码到.kt文件中会直接将 Java 语言转化成 kotlin 语言;

  • 区别除了上述的优点外,最大的区别可能是 kotlin函数式编程,体现如下:

    • 函数类型:允许函数接收其他函数作为参数,或返回其他函数;
    • 支持 lambda 表达式,用最少的样板代码方便地传递代码块;
    • 数据类,提供了创建不可变数据对象的简明语法;
    • 标准库中提供丰富的函数式API,让你用函数式编程风格操作对象和集合;

    如果没有理解也没有关系,后面介绍会涉及到,再回过头来看即可。

一些链接🔗

Kotlin的基础语法

主要包括:函数声明、变量、字符串模板、类和属性、目录和包、枚举类型、whenifwhilefor、智能转化 以及 异常处理。

函数声明

1
2
3
4
5
6
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}

//可以简写为
fun max(a: Int, b: Int) = if (a > b) a else b

以上述函数举例说明:

  • 函数声明都以 fun 关键字开头
  • max 是方法名字,后面紧跟着括号内的是输入参数;
  • 冒号表示类型,kotlin 先写变量,后面接变量类型;
  • 参数之后跟着返回类型,如果没有可以省略;
  • Kotlin 中语句结尾不需要分号; ;
  • returnif是表达式而非语句(表达式和语句的区别在于表达式有返回值,而语句没有);

变量

Kotlin声明变量比Java中要简洁;

1
2
3
4
5
6
 val a: Int = 1  // 立即赋值
val b = 2 // 自动推断出 `Int` 类型(类型推导)
val c: Int // 如果没有初始值类型不能省略
c = 3 // 明确赋值

var d: Int? = null //赋值可为空

以上述代码举例说明:

  • Kotlin声明变量只有 val(不可变变量,只能初始化一次,来自value) 和`var (可变变量,来自variable)两种;
  • 声明变量且赋值时,可以省略变量类型,因为kotlin可以自动推导变量类型;
  • 变量赋值时使用 表示可为空;
  • 默认属性是public,可省略;

PS : 虽然val引用自身是不可变的,但是它所指的对象可能是可变的* (如果不理解没有关系,后续章节会介绍)

1
2
val language = arrayListOf("java")
language.add("kotlin")

字符串模版

1
2
3
4
5
fun max(a: Int, : Int): Int {
var result = if (a > b) a else b
println("result = $result") //等同于:println("result = " + result)
return result
}

还是上面的代码,稍微修改后可以看出:

  • kotlin中可以通过在变量名加上符号 $ 来打印出该变量,效率更高;(编译后可看出是通过stringBuilder实现的);
  • printlnkotlin中的API库,使用方便简洁;

类和属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//kotlin
class Person(name: String) {
lateinit var name: String
}

//使用

//Kotlin
var person = Person("Bob")
person.name //get name
person.name = "new Name" //set name

//java
Person person = new Person("Bob");
person.getName();
person.setName("Bob");

kotlin中对于类属性具有默认的gettersetterval变量只具有gettervar变量具有gettersetter)。

目录和包

Kotlin中包名和目录路径可以不一致(但是最好保持一致)。

声明枚举类型

1
2
3
enum class color {
RED, ORAGE, YELLOW
}
  • 使用关键字 num class
  • 枚举类中定义方法,需要用分号区分枚举常量 和方法定义;

when的使用

when 和if一样,也是一个有返回值的表达式。

1
2
3
4
5
6
7
8
9
enum class Colors {
RED_1, RED_2, ORAGE, YELLOW
}

var color = when(color) {
Colors.RED_1, Colors.RED_2 -> "RED"
Colors.ORAGE -> "ORAGE"
Colors.YELLOW -> "YELLOW"
}
  • 不需要break语句;
  • 多个分支可以用逗号隔开;
  • when也可以不带参数;

if的使用

1
2
3
4
fun max(a: Int, b: Int): Int {
var result = if (a > b) a else b
return result
}
  • 如果if分支只有一个表达式,那么花括号可以省略;
  • 如果if分支是一个代码块,则代码块中的最后一个表达式可以作为结果返回;

while和for循环

在kotlin中,while循环的使用(while和do-while的使用)和Java中基本一致。

对于for循环,kotlin中有所不同。在kotlin中引入了 区间 的概念,使用运算符 .. 来表示区间。

1
2
3
4
5
6
7
val oneToTen = 1..10
for (a in oneToTen) {
println("a = $a")
}

//in的使用
c in 'a'..'z' //等于 a <= 'c' && c <= 'z'
  • kotlin区间是包含前后边界值的;
  • 使用了关键字 in 检查区间成员(也可以检查集合内容,in的相反是 !n
  • in 关键字的使用如上所示,同时inwhenif一些关键字可以搭配使用;

智能转化

智能转化是kotlin的类型转换。

1
2
3
4
5
6
if (e is Int) {
return "e is Int, value is $e"
}

//显示转化
val a = e as Int
  • 经过is关键字后,e的类型被智能转化成Int类型了;
  • 还可以使用关键字as,显示的转化类型;

抛出和处理异常

kotlin中抛出和处理异常基本和Java类似,与Java不同的是throw结构可以是一个表达式,能作为另一个表达式的一部分使用;

1
2
3
4
5
6
7
val percentage = 
if (a in 1..10)
a
else
throw IllegalArgumentException {
"number must be between 1 and 10 : $a is out of "
}

Kotlin使用try catch finallyJava基本类似,同时try catch也是一个表达式,且该表达式的值是最后一个表示式的值;

1
2
3
4
5
6
7
val reader: BufferedReader;
val number =
try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
null
}
坚持原创技术分享,您的支持将鼓励我继续创作!