Kotlin语法学习

131 阅读2分钟

Kotlin的循环

image.png

  • 第一种 闭区间 【1,10】
  • 第二种 不包含10 【1, 10)
  • 第三种 从10开始倒着循环到1,递减循环
  • 第四种 【1,10】每次跳2步即 1、3、5、7、9 步进循环
  • 第五种 重复函数10次

Kotlin集合操作符

image.png

  • 一个数组
  • map操作符的意思是,使用某种条件,将其每个元素进行转化,然后返回一个新的List
  • filter增加过滤条件,去掉符合条件的数组,之后返回
  • find增加条件,返回符合条件的数组
/**
 * 集合的操作符的使用
 * filter:根据条件过滤掉元素
 * also:结果输出
 * map:对每一个元素处理后返回本身
 * reduce:两两处理
 */
private fun listSign() {
    val a = arrayOf("4", "0", "7", "i", "f", "w", "0", "9")
    val index = arrayOf(5, 3, 9, 4, 8, 3, 1, 9, 2, 1, 7)

    index
        .filter {
            it < a.size
        }
        .also {
            println("result: $it")
        }
        .map {
            a[it]
        }
        .also {
            println("result: $it")
        }
        .reduce{s, s1 ->
            "$s$s1"
        }
        .also {
            println("result: $it")
        }
}

image.png

作用域函数

image.png

  • let与run的区别
/**
 * 作用域函数
 */
private fun sysFun() {

    val user = User("Jiayuanfa")
    // let 与 run 都会返回闭包的执行结果,区别在于let有闭包参数,run没有闭包参数
    val letResult = user.let { mUser ->
        "let::${mUser.javaClass}"
    }
    println(letResult)

    val runResult = user.run {
        "run::${this.javaClass}"
    }
    println(runResult)
}
  • also与apply:使用场景 就是对某一个对象进行操作之后,可以直接对其进行链式操作 比如 user.also{ it -> println(it) }.apply{ println(this) }.name
// also 与 apply都不返回闭包的结果,区别是 also有闭包参数 apply没有闭包参数
val alsoResult = user.also {
    "alsoResult::${it.javaClass}"
}
println(alsoResult)
val applyResult = user.apply {
    "applyResult::${this.javaClass}"
}
println(applyResult)

image.png

  • takeIf与takeUnless
// takeIf表达式,写入判断条件,如果条件不成立,返回的是空值,反之,返回本身。
user.takeIf {
    it.name.isNotEmpty()
}?.also {
    println("姓名不为空")
}?: println("姓名为空值")

// takeUnless表达式,写入判断条件,如果条件成立,返回的是空值,反之,返回本身。
user.takeUnless {
    it.name.isNotEmpty()
}?.also {
    println("姓名为空")
}?: println("姓名为${user.name}")
  • repeat重复执行函数
// 重复执行闭包
repeat(5) {
    println(user.name)
    println(it)
}

常用的元素操作符

  • contains 是否包含某个元素
  • elementAt 返回对应下标的元素,越界会抛出错误 indexOutOfBounds
  • firstOfNull与lastOfNull
/**
 * firstOrNull 返回数组中第一个符合条件的元素
 */
private fun array() {
    val arr = arrayOf("fage", "jiayuanfa", "jiayuanfa", "jia")
    println("第一个符合条件的元素为:" + arr.firstOrNull {
        it.contains("j")
    })

    println("最后一个符合条件的元素为:" + arr.lastOrNull {
        it.contains("j")
    })
}

image.png

  • indexOf 返回指定元素的下标 没有返回-1
  • sigleOfNull 返回符合条件的单个元素 如有没有符合或者超过一个,则返回Null

image.png

image.png

image.png

数据类 data class

  • 数据类不能被继承 本身就是final类型的类

Kotlin中的枚举类 也就是密闭类

package com.example.kotlindemo

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

/**
 * <pre>
 *     author: Jafar
 *     date  : 2021/10/11
 *     desc  :
 * </pre>
 */
class SealedActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sealed(SuperCommand.A)
    }

    private fun sealed(superCommand: SuperCommand) {
        when (superCommand) {
            SuperCommand.A -> {
                println("打印了A${SuperCommand.A.num}")
            }
            SuperCommand.B -> {

            }
            SuperCommand.C -> {

            }
            SuperCommand.D -> {

            }
        }
    }

    sealed class SuperCommand {
        object A : SuperCommand() {
            var num = 0
        }
        object B : SuperCommand()
        object C : SuperCommand()
        object D : SuperCommand()
    }
}