目录
函数
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 b
return 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" -> 2
else -> 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) // 每次+2
println(i)
for(i in 10 downTo 1) // 降序
println(i)
for(i in 10 downTo 1 step 2) // 降序+2
println(i)
面向对象
继承
open class Base
{
var a:Int = 0
}
class dervice : Base()
{
var b:Int = 0
}
fun main() {
var base = Base()
base.a = 1
var 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
}
当表达式只有一个变量是,大括号也可以省略。