本文共 4613 字,大约阅读时间需要 15 分钟。
该内容是对《第一行代码》第3版kotlin基础知识的总结
fun main() { val a = 10 println("a = " + a)}
val a: Int = 10
Java基本数据类型 | Kotlin对象数据类型 | 数据类型说明 |
---|---|---|
int | Int | 整型 |
long | Long | 长整型 |
short | Short | 短整型 |
float | float | 单精度浮点型 |
double | Double | 双精度浮点型 |
boolean | Boolean | 布尔值 |
char | Char | 字符型 |
byte | Byte | 字节型 |
永远优先使用val,当val无法满足需求时改用var,这样设计出来的程序会更加健壮,也更加符合高质量的编码规范
fun methodName(param1: Int, param2: Int): Int { return 0}
当一个函数只有一行时,可以直接将唯一一行代码写在函数定义的尾部,中间用等号连接即可
fun largerNumber(num1: Int, num2: Int) : Int = max(num1, num2)
kotlin中的if语句和java中的if语句几乎没有区别:
fun largerNumber(num1: Int, num2: Int): Int { var value = 0 if(num1 > num2) { value = num1 }else { value = num2 } return value}
kotlin中的if语句可以把每个条件的最后一行代码作为返回值
fun largerNumber(num1: Int, num2: Int): Int { return if(num1 > num2) { num1 }else{ num2 }}
when允许传入一个任意类型的参数,然后可以在when的结构体中定义一系列的条件,格式是:匹配值 -> {执行逻辑}
当执行逻辑只有一行代码时,{ }可以省略
fun getScore(name: String) = when (name) { "Tom" -> 86 "Jim" -> 77 "Jack" -> 95 "Lily" -> 100 else -> 0}
除了精确匹配之外,when还允许类型匹配
fun checkNumber(num: Number) { when (num) { is Int -> println("number is Int") is Double -> println("number is Double") else -> println("number not support") }}
when语句还有一种不带参数的用法:
fun getScore(name: String) = when { name == "Tom" -> 86 name == "Jim" -> 77 name == "Jack" -> 95 name == "Lily" -> 100 else -> 0}
val range = 0 .. 10相当于数学上的[0,10]
fun main() { for (i in 0 .. 10) { println(i) }}
fun main() { for (i in 0 until 10 step 2) { println(i) }}
fun main() { for(i in 10 downTo 1) { println(i) }}
定义一个类:
class Person { var name = "" var age = 0 fun eat() { println("$name is eating. He is $age years old.") }}
实例化对象:
val p = Person()
kotlin默认的类都是不可继承的,需要加上open
open class Person{}
java中继承的关键字是extends,而在Kotlin中变成了一个冒号
class Student : Person() { var sno = "" var grade = 0}
主构造函数是最常用的构造函数,每个类默认都会有一个不带参的主构造函数,主构造函数的特点是没有函数体,直接定义在类名的后面即可
class Student(val sno: String, val grade: Int) : Person() {}
主构造函数没有函数体,如果想在主构造函数中实现一些逻辑,可以写在init结构体中
class Student(val sno: String, val grade: Int) : Person() { init{ println("test") }}
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) { constructor(name: String, age: Int) : this("", 0, name, age) {} constructor() : this("", 0) {}}
与java相同
在kotlin中创建数据类使用data关键字,kotlin会根据主构造函数中的参数自动生成equals()、hashCode()等固定且无实际逻辑意义的函数
data class Cellphone(val brand: String, val price: Double)
在kotlin中创建单例类使用object关键字
object Singleton { fun test() {}}
Singleton是一个单例类,调用单例类中的函数:
Singleton.test()
这种写法看上去像是静态方法的调用,实际上kotlin为我们生成了一个类的实例,并且保证全局只有一个。
Lambda的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")val maxLengthFruit = list.maxBy { it.length }
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")val newList = list.map { it.toUpperCase() }
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")val newList = list.filter { it.length <= 5 }
以创建线程为例:
Thread(object: Runnable { ovveride fun run() { }})
如果我们在Koltin代码中调用了一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API
Thread { println("Thread is running")}.start()
let属于Kotlin中的标准函数
obj.let { obj2 ->}
obj对象会作为参数传入Lambda表达式中,即obj就是obj2,这就是let的作用
let配合?.进行代码优化fun doStudy(study: Study?) { if(study != null) { study.readBooks() } if(study != null) { study.doHomework() }}
fun doStudy(study: Study?) { study?.let { it.readBooks() it.doHomework() }}
Kotlin中字符串内嵌表达式的语法规则:
“Hello, ${obj.name}. nice to meet you!” Kotlin允许在字符串中嵌入${}这种语法结构的表达式,并在允许时使用表达式执行的结构替代这一部分的内容Kotlin可以为函数的参数设定默认值
fun test(num: Int, str: String = "hello") {}
如果给第一个参数num设定默认值
fun test(num: Int = 100, str: String") {}
调用时应该通过键值对的方式来传参
test(str = "hello", num = 10)
这样就不必向传统写法那样按照参数定义的顺序来传参
转载地址:http://tdtzi.baihongyu.com/