目录
函数
if
when
循环
面向对象
继承
主构造函数
接口
修饰符
编辑数据类
单例类
Lambda编程
集合
lambda用法
常见函数式API
空指针
判空辅助工具
字符串内嵌表达式
函数
fun add1(a:Int,b:Int):Int{return a+b
}fun add2(a:Int,b:Int):Int = a+b // 只有一句的可以写成赋值的形式
if
fun func(a:Int,b:Int): Int {var ret:Int = if(a>b){a}else breturn ret
}
if语句有返回值,也可以写成赋值的形式:
fun func1(a:Int,b:Int):Int = if (a>b) a else b
when
fun getstring(str:String) = when(str) {"jack" -> 1"mike" -> 2else -> 3
}
when也有返回值,用法类似switch。
循环
for(i in 1..10) // 左闭右闭区间println(i)for(i in 1 until 10) // 坐闭右开区间println(i)for(i in 1..10 step 2) // 每次+2println(i)for(i in 10 downTo 1) // 降序println(i)for(i in 10 downTo 1 step 2) // 降序+2println(i)
面向对象
继承
open class Base
{var a:Int = 0
}
class dervice : Base()
{var b:Int = 0
}
fun main() {var base = Base()base.a = 1var der = dervice()der.a = 2
}
加上open关键字才能被继承
主构造函数
open class Base(val aa:Int,val bb:Int)
{}
class dervice(val a:Int,val b:Int): Base(a,b)
{init {println("init")}
}
fun main() {val der = dervice(2,3)println(der.a)
}
主构造函数没函数体,但是需要其他操作可以写在init里面。若想调用父类的构造函数,可以在Base()里传参。
接口
interface JAY
{fun jay(name:String)fun chou(name:String)
}
class jaychou : JAY
{override fun jay(name: String) {println(name)}override fun chou(name: String) {println(name)}
}
fun main() {val jc = jaychou()jc.jay("Jay")jc.chou("Chou")
}
也存在默认的接口,即没有自己实现就调用默认的。
修饰符
数据类
数据类存在的意义:数据类 Data class 存在的意义是什么?_data class must have at least one primary construc-CSDN博客https://blog.csdn.net/xiaokangss/article/details/130712827
data class Savadata(var name:String,var number:Int){}
data class比class 多实现了 toString()、hashCode()、equals()、copy()、componentN()方法。但是kotlin系统会默认帮我实现而不需要像JAVA那样重新这些方法。
hashCode()、equals()是用来比较对象内容是否相同,多用于HashMap等容器中;toString()是用来打印对象内容;copy()实现了复制功能;componentN()提供了快速访问元素的功能。data class只是是kotlin提供的具有常用数据model功能的类,用于提升开发效率。
单例类
object sig {fun test(){println("test")}
}
fun main() {sig.test()
}
不需要提供静态变量和静态方法,系统会自动帮我们生成。
Lambda编程
集合
val list = listOf("apple","banana","pear")
fun main() {for(i in list){println(i)}
}
用listOf来一次性将list元素给add进去,避免了多次add,简化了代码。 不过只适用于不可变集合。针对可变集合使用mutableListOf。同样的,针对set也是一样。可以调用setOf。而map除了可以map["apple"] = 1之外,可以使用mapOf:
val map = mapOf("apple" to 1,"pear" to 2)
fun main() {for(i in map){println(i.key + i.value)}
}
lambda用法
val list = listOf("apple","banana","pear")
val map = mapOf("apple" to 1,"pear" to 2)
fun main() {var maxnumber = list.maxBy { it.length }println(maxnumber)
}
上述代码求最长的单词。也可以用lambda:
fun main() {//var maxnumber = list.maxBy { it.length }var maxnumber = list.maxBy { i:String -> i.length }println(maxnumber)
}
lambda格式:{ 参数名1:参数类型,参数名2:参数类型 -> 函数体 }
常见函数式API
map(对元素进行任意的映射转化)
fun main() {var newlist = list.map{it.toUpperCase() }for(i in newlist){println(i)}
}
// 将小写转化为大写
filter(过滤元素)
fun main() {var newlist = list.filter { it.length<=4 }for(i in newlist){println(i)}
}
// 筛选字母数量小于等于4的元素
fun main() {var newlist = list.filter { it.length<=4 }.map{it.toUpperCase()}for(i in newlist){println(i)}
}
// 也可以配合map使用
any(是否存在一个元素满足条件)
all(是否全部元素都满足条件)
var ret1 = list.all{it.length>=3}
var ret2 = list.any{it.length>=5}
空指针
kotlin在编译时期就把会存在空指针问题的情况就提前报错。为了防止区别哪些变量可以为空,设置了在类型后面加上?的形式。
fun test(num:Int?){if(num!=null){}} // 表示num可为空,并且一般需要加上判空
判空辅助工具
字符串内嵌表达式
class test{var i = 1
}
fun main(){println("555${test().i}") // 执行结果5551
}
当表达式只有一个变量是,大括号也可以省略。