侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

Kotlin 常用语法-介绍

Z同学
2021-07-19 / 0 评论 / 0 点赞 / 484 阅读 / 6,159 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

通过前面几篇文章的学习,针对Kotlin已经有了一个比较全面的映像了。阅读代码应该能够理解相关的含义了。

这篇主要是学习一下常用的用法,复习知识的同时。了解Kotlin的一些语法的灵活使用。

常用语法

1.给函数添加默认参数

//我们在定义函数的时候,可以直接给它传默认参数。
fun test(a: Int = 0, b: String = "null") {
    println(" a= $a ,b= $b")
}

fun main(array: Array<String>) {
    test()
    test(12)
    test(20,"zinyan")
}

//输出:
 a= 0 ,b= null
 a= 12 ,b= null
 a= 20 ,b= zinyan

2.创建只读的List和Map,创建支持修改的List和Map

var list = listOf("a", "b", "c", "d") //创建的List 只能读,不能写
list[0]="12" //错误
var map = mapOf("a" to 1, "b" to 2, "c" to 3) //创建的Map 只能读,不能写
map["a"] = 12 //错误
var list1 = mutableListOf("a", "b", "c", "d")//创建的List 可以读可以写
list1[0] = "A" //正常
var map1 = mutableMapOf("a" to 1, "b" to 2, "c" to 3)//创建的Map 可以读可以写
map1["a"] = 12 // 正常

3.过滤List

fun main(array: Array<String>) {
    var indes = listOf<Int>(0, 1, 2, 3, 4, 5, 6, 7)
    println(indes)
    //得到集合中的x>0 的数据 
    val positives = indes.filter { x ->
        x > 0
    }
    
    println(positives)
}
//输出:
[0, 1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7]

更精简的写法:

val positibew = indes.filter { it > 0 }

4.检测元素是否存在于集合之中

使用in 关键字

var titleArray = listOf("Z同学","Y同学","X同学","B同学")
 if("Zinyan" in titleArray){
     println("zinyan 在数组之中")
 }else{
     println("zinyan 不在数组之中")
 }
 if("Z同学" !in titleArray){
     println("Z同学不在数组之中")
 }else{
     println("Z同学在数组之中")
 }

5.类型判断

when (x) {
    is Foo ->{
         //写你的业务 
    }
    is Bar ->{
         //写你的业务 
    }
    else ->{
      //写你的业务 
    }
}

6.遍历map/pair 型集合

fun main(array: Array<String>) {
    var map = mapOf<String,Any>("name" to "Z同学","url" to "zinyan.com")
    for((k,v) in map){
        println("$k -> $v")
    }
}

//输出:
name -> Z同学
url -> zinyan.com

备注: 上面的KV 可以改成任意名字。

7.使用区间

for(i in 1..100){//闭区间,包含100。 参数从1到100
    println(i)
}
 for(i in 1 until 100){ //半开区间,不包含100,参数从1到99
     println(i)
 }
 for(i in 2..10 step 2){ //闭区间,步长为2 ,参数为:2,4,6,8,10
     println(i)
 }
 for(i in 10 downTo 1){ //闭区间,参数从10 到1,倒叙
     println(i)
 }
 var i =1
 if(i in 1..10){ //检测参数i 是否在闭区间1到10 里面。
     println("包含")
 }

8.延迟属性

val p: String by lazy {
    //计算该字符串
    print("sss")
    "P的值"
}

9.扩展函数

class A{}

fun A.kuozan(){
    println("这是一个扩展")
}

fun main(array: Array<String>) {
    var a = A()
    a.kuozan()
}
//输出
这是一个扩展

10.创建单例对象

object Resource{
    val name="Z同学"
}

fun main(array: Array<String>) {
   println(Resource.name)
}
//输出
Z同学

11.If not null 缩写

  //得到一个文件夹集合对象
val files = File("Test").listFiles()
  //因为可能为null 所以添加?问号 这样不会因为空值崩溃
  println(files?.size)

12.If not null and else 缩写

  //得到一个文件夹集合对象
val files = File("Test").listFiles()
  //如果files是null的,那么就返回0 ,不是空就返回size值
  println(files?.size?:0)

13.if null执行一个语句

fun main(array: Array<String>) {
  val  values= mapOf<String,String>("url" to "zinyan.com","name" to "Z同学")
    val email = values["email"]?: throw IllegalStateException("Email  is missing! ")
}

执行结果 会返回IllegalStateException 错误。 因为关键字: ?:

14.在集合之中创建null 值

只需要在String 后面添加?即可

val values = listOf<String?>("zinyan.com", "name", "Null", null, "哈哈")

15.在可能为空的集合中取第一元素

如果集合之中有null。那么可以取到值的时候,将null赋值为其他情况

val values = listOf<String?>(null, "name", "Null", null, "哈哈")
//获取集合的开头值。  只有list是支持null的情况下才有下面的方法。
val mainEmail = values.firstOrNull() ?: "有空值"
println(mainEmail)


//输出:
有空值

16.If not null 执行代码

只有当参数不是null 的时候,才会执行。 可以规避掉null 值的情况

fun main(array: Array<String>) {
    var value: String? = null
    value?.let {
        //代码如果不为空 就会执行
        println("value= $value")
    }
    value = "Zinyan"
    value?.let {
        //代码如果不为空 就会执行
        println("value= $value")
    }
}
//输出:
value= Zinyan

17.映射可空值(如果非空的话)

fun transformValue(aa: String) = aa

fun main(array: Array<String>) {
    val values: String? = "结果值"
    val mapped = values?.let {
        transformValue(it)
    } ?: "其他结果"
    
}

18.返回When表达式

//传参String,返回值Int
fun transform(color:String):Int{
    return when(color){
        "RED" ->0
        "BLUE" ->1
        "GREEN" ->2
        else ->-1
    }
}
fun main(array: Array<String>) {
    var values = transform("RED")
}

19.Try/catch 表达式

fun test() {
    val result = try {
        count()
    } catch (e: Exception) {
        throw IllegalStateException(e)
    }
}

20.If表达式

fun test(temp: Int) {
    val result = if (temp == 1) {
        "one"
    } else if (temp == 2) {
        "two"
    } else {
        "other"
    }
}

21.返回类型为Unit的方法的Builder风格用法

fun arrayOfMinusOnes(size: Int): IntArray {
    return IntArray(size).apply {
        fill(-1)
    }
}

fun main(array: Array<String>) {
    val ss: IntArray = arrayOfMinusOnes(10)
    println(ss.toString())
}
//输出:  返回内存地址
[I@6f94fa3e

22.单表达式函数

fun  theAnswer()=23

两种表达式是等价的,只是第一种会更精简而已

fun  theAnswer():Int{
    return 23
}

这种表达式除了可以直接与返回参数使用外,还能与其他函数一起使用。例如When表达式。if表达式。等等

fun transForm(color: String): Int = when (color) {
    "Red" -> 0
    "Green" -> 1
    else -> -1
}

23.对一个对象实例调用多个方法(with)

class Turtle {
    fun penDown() {}
    fun penUp() {}
    fun turn(degrees: Double) {}
    fun forward(pixels: Double) {}
}

fun main(array: Array<String>) {
    val turtle = Turtle()
    with(turtle) {
        penDown()
        for (i in 1..4) {
            forward(100.0)
            turn(90.0)
        }
        penUp()
    }
}

将会在with块里面按照顺序执行上面的代码

24.配置对象的属性(apply)

class Test {
    var length: Int = 0
    var breadth: Int = 0
    var color: Int = 0
    override fun toString(): String {
        return "$length+$breadth+$color"
    }
}
fun main(array: Array<String>) {
    val temp = Test().apply {
        length = 4
        breadth = 5
        color = 0xFAFAFA
    }
    println(temp.toString())
}
//输出
4+5+16448250

25.获取输入流 InputStream

//通过InputStream 获取reader 数据流
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
    println(reader.readText())
}

26.使用可空布尔

fun main(array: Array<String>) {
    val b: Boolean? = null
    if(b ==true){
        println("b 是true")
    }else{
        println("b 是false 或者 null")
    }
}
//输出
b 是false 或者 null

27.交换两个变量的值

var a = 1
var b = 2
println("b 的值 $b")
println("a 的值 $a")

a = b.also { b = a }

println("b 的值 $b")
println("a 的值 $a")

输出:
b 的值 2
a 的值 1
b 的值 1
a 的值 2

28.TODO(): 将代码标记为不完整

Kotlin的标准库止中有一个TODO()函数。 这个函数总是抛出一个NotImplementedError

返回值类型为Nothing,因此无论预期类型是什么都可以使用它,还有一个接受原因参数的重载。

fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")
0

评论区