基本语法
声明变量
val 不可变,类似于const
val 可变变量
逻辑控制语句
if
注意 if 可以有返回值
fun max(a:Int,b:Int): Int {
return if(a>b) {
a
} else {
b
}
}
当函数只有一行代码时,可省略函数体,用等号直接串联在函数定义后,虽然max不是一行,但他和一行代码作用是一样的,可简写为:
fun max2(a:Int,b:Int)=if(a>b) a else b
when 语句
类似于switch case
fun getScore(name:String) =
when (name) {
"Tome"-> 80
"Sony"-> 100
else -> 0
}
注意这里的箭头函数
三种用法
- when expressions where it separates "matching/condition" part from "result/execution" block
val greet = when(args[0]) {
"Apple", "Orange" -> "fruit"
is Number -> "How many?"
else -> "hi!"
}
- lambda expressions where it separates parameters from function body
val lambda = { a:String -> "hi!" }
items.filter { element -> element == "search" }
- function types where it separates parameters types from result type e.g. comparator
fun <T> sort(comparator:(T,T) -> Int){
}
循环语句
双闭区间:
0..10 表示 [0,10] i递增
0 downTo 表示 [10,0] i递减
for(i in 0..10){
println("index:${i}")
}
单端闭区间:
0 util 10 表示 [0,10)
步长 step
for(i in 0 until 10 step 2){
println("index:${i}")
}
面向对象编程
class
差异点:
-
实例化不用new关键字
-
默认不可继承,需声明open后才会变成继承类
-
继承的语法为冒号
:(相当于extends) -
构造函数
init(相当于constructor) -
子类调用父类构造函数,直接继承父类构造函数,直接用
()括号表示(相当于super())
open class Person(val name: String,val age:Int) {
fun eat () {
println("the $age $name is eating")
}
}
class Student(name:String,age:Int,val grade: Int) : Person(name,age) {
init {
println("hi")
}
}
接口
语法 , 相当于 implement
interface Study {
fun readBooks()
fun doHomework()
}
class Student(name:String,age:Int,val grade: Int) : Person(name,age) , Study {
init {
println("hi")
}
override fun readBooks() {
println("$name read book")
}
override fun doHomework() {
println("$name do homework")
}
}
数据类和单例类
数据类用data class 声明(个人理解为ts 里定义数据结构的interface)
data class {}
单例类
object class
object Singleton {
fun test(){
//
}
}
Singleton.test()
看起来类似于静态方法调用,实则创建了一个Singleton类的实例,并保证全局唯一
lambda 编程
前置知识
listOf() 创建一个不可变集合 mutableListOf() 可变集合
setOf() / mutableSetOf()
map
val map = HashMap<String,Int>()
map.put("apple",1)
map.put("pear",2)
建议这种写法
map["banana"]=3
更精简的写法
val mao = mapOf("apple" to 1, "Orange" to 2)
lambda 表达式与匿名函数是“函数字面值”,即未声明的函数, 但立即做为表达式传递。 即一小段可以用来当作参数传递的代码
语法:
{参数名1:参数类型,参数名2:参数类型->函数体}
多数情况并不需要完整结构,一步一步推导简写形式
val list= listOf("oppo","vivo","apple")
val lambda = {phone:String -> phone.length}
val res = list.maxByOrNull(lambda)
lambda表达式作为最后一个参数时,可以将lambda提到括号外面去 如果labmda是函数唯一参数的话可以省略括号
val res = list.maxByOrNull {phone:String -> phone.length}
Kotlin具有类型推导,类型可以省略
当lambda表达式只有一个参数时,也不必声明参数名,可以用it表示
val res = list.maxByOrNull {it.length}
map/filter/any/all 基本跟js用法一致