kotlin入门 | 青训营笔记

112 阅读5分钟

变量与函数

这是我参与「第四届青训营 」笔记创作活动的第3天

变量

Kotlin只允许在变量前声明两种关键字valvar

  • val声明一个不可变的变量,对应java中的final变量
  • var声明一个可变的变量,初始赋值后再被重新赋值

Java和Kotlin数据类型对照表

函数

fun methodName(param1: Int, param2: Int): Int {
 return 0
}

fun是定义函数的关键字,跟在后面的是函数名,括号中的是参数声明格式为参数名: 参数类型,括号后面则是声明函数返回类型。

定义一个函数,接收两个整型参数,然后总是返回两个参数中更大的那个数。

fun largerNumber(num1: Int, num2: Int): Int {
 return max(num1, num2)
}

kotlin语法糖

Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间用等号连接即可。即上述代码可以简化如下形式

fun largerNumber(num1: Int, num2: Int): Int = max(num1, num2)
// fun largerNumber(num1: Int, num2: Int) = max(num1, num2)

逻辑控制

if

if语句在Java中几乎一致,主要记录下述不同之处

Kotlin中的if语句相比于Java有一个额外的功能,它是可以有返回值的,返回值就是if语句每一个条件中最后一行代码的返回值。

fun largerNumber(num1: Int, num2: Int): Int {
 return if (num1 > num2) {
 num1
 } else {
 num2
 }
}

还可以结合语法糖使得代码更加精简

fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2

when

when解决了Java switch的痛点,且增加了更多强大的特性

when(任意类型参数) {
    匹配值 -> { 执行逻辑 }
    // { }可以省略
}

定义一个函数根据姓名得到相应分数

fun getScore(name: String) = when {
 name == "Jim" -> 77
 name == "Jack" -> 95
 else -> 0
}

循环语句

Kotlin提供了while循环和for循环,其中while循环不管是在语法还是使用技巧上都和Java中的while循环没有任何区别,但在for循环方面做了很大幅度的修改

// 表达出来就是[0, 10]
val range = 0..10
//可以使用for in遍历
for (i in range) {
 println(i)
 }

Kotlin中可以使用until关键字来创建一个左闭右开的区间,如val range = 0 until 10,它的数学表达方式是 [0, 10)

// 可以使用step关键字定义步长
// 每次执行循环都会在区间范围内递增2
for (i in 0 until 10 step 2) {
 println(i)
 }

创建一个降序的区间,可以使用downTo关键字,用法如下:

// 创建了一个[10, 1]的降序区间
for (i in 10 downTo 1) {
 println(i)
 }

面向对象编程

类与对象

新建一个Person类,右击文件夹选择Kotlin File/Class, 接着选择Class

class Person {
 var name = ""
 var age = 0
 fun eat() {
 println("$name is eating. He is $age years old.")
 }
}

对这个类进行实例化

fun main() {
 val p = Person()
 p.name = "Jack"
 p.age = 19
 p.eat()
}

继承

在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了final关键字

所以为了使得person类可以继承需要在类前面加上关键字open

open class Person {
 ...
}

新建一个Student类继承Person类

class Student : Person() {
 var sno = ""
 var grade = 0
}

接口

Kotlin中的接口部分和Java几乎是完全一致的。

创建一个Study接口,并在接口中添加相关函数

interface Study {
 fun readBooks()
 fun doHomework()
}

接着让Student类去实现Study接口了,Kotlin中统一使用冒号便是继承和实现接口,使用override关键字来重写父类或者实现接口中的函数

class Student(name: String, age: Int) : Person(name, age), Study {
 override fun readBooks() {
 println(name + " is reading.")
 }
 
 override fun doHomework() {
 println(name + " is doing homework.")
 }
}

在main()函数中编写如下代码来调用这两个接口中的函数

fun main() {
 val student = Student("Jack", 19)
 doStudy(student)
}
// 使用了多态的特性
fun doStudy(study: Study) {
 study.readBooks()
 study.doHomework()
}

Java和Kotlin函数可见性修饰符对照表

数据类与单例类

数据类通常占据着非常重要的角色,它们用于将服务器端或数据库中的数据映射到内存中,为编程逻辑提供数据模型的支持

创建一个数据类,只需要在类前添加关键字dataKotlin会根据主构造函数中的参数帮你将equals()、hashCode()、toString()等固定且无实际逻辑意义的方法自动生成,从而大大减少了开发的工作量。

data class Cellphone(val brand: String, val price: Double)

在kotlin中创建一个单例类只需要将class关键字改成object关键字即可

object Singleton {
    fun singletonTest() {
     println("singletonTest is called.")
     }
}

//调用方式 Singleton.singletonTest()

Lambda编程

集合的创建与遍历

在Kotlin中创建一个包含许多水果名称的集合

val list = ArrayList()
list.add("Apple")
list.add("Banana")
list.add("Orange")
list.add("Pear")
list.add("Grape")

//此Kotlin专门提供了一个内置的listOf()函数来简化初始化集合的写法
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")

使用for-in循环来遍历这个集合

fun main() {
 val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
 for (fruit in list) {
   println(fruit)
 }
}

listOf()函数创建的是一个不可变的集合,不可变的集合指的就是该集合只能用于读取,我们无法对集合进行添加、修改或删除操作。可以使用mutableListOf()函数创建可变集合

fun main() {
 val list = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
 list.add("Watermelon")
 for (fruit in list) {
 println(fruit)
 }
}

Map集合的使用

val map = HashMap()
map["Apple"] = 1
map["Banana"] = 2
map["Orange"] = 3
map["Pear"] = 4
map["Grape"] = 5

// 使用mapOf()和mutableMapOf()函数来继续简化Map的用法
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)

参考资料

  • 第一行代码--Android(第三版)