目录

函数

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博客icon-default.png?t=N7T8https://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
}

当表达式只有一个变量是,大括号也可以省略。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐