Kotlin 习惯用语集合

本文参考

字符串插值

fun main() {
    val name = "Kotlin"

    print("Hello $name!")
}
Hello Kotlin!

标记未完成(TODO)

// 这将抛出异常 kotlin.NotImplementedError
// TODO("注释中的 TODO 不会抛异常")
fun getString(): Nothing = TODO("明天再做")


fun main() {
    getString()
}

类型确认

fun main() {
    val int: Any = 1

    println(int is String)
    println(int is Long)
    print(int is Int)
}
false
false
true

空(null)判断

fun main() {
    val nullableList: List<Int>? = null

    println(nullableList ?: listOf(1))
    print(nullableList?.size)
}
[1]
null

if、when、try赋值表达式

fun main() {
    val int = 0

    val isOdd = if (int % 2 == 0) false else true

    val valueInfo = when {
        int > 0 -> "大于 0"
        int == 0 -> "等于 0"
        else -> "小于 0"
    }

    val isError = try {
        if (int == 0) error("值不能为 0")
        false
    }catch (e: Exception) {
        true
    }

    println(isOdd)
    println(valueInfo)
    print(isError)
}
false
等于 0
true

参数默认值

class Kotlin(val name: String = "Kotlin")


fun setName(name: String = "Kotlin") {
    print(name)
}


fun main() {
    val defaultKotlin = Kotlin()
    println(defaultKotlin.name)

    setName()
}
Kotlin
Kotlin

单表达式函数

fun getName() = "Kotlin"


fun checkNum(int: Int) = when {
    int > 0 -> "大于 0"
    int == 0 -> "等于 0"
    else -> "小于 0"
}


fun main() {
    println(getName())
    print(checkNum(2))
}
Kotlin
大于 0

return 前提

fun isOdd(int: Int): Boolean {
    return if (int % 2 == 0) false
    else true
}


fun getNameBy(ext: String): String {
    return when(ext) {
        ".kt" -> "Kotlin"
        ".java" -> "Java"
        else -> "Other"
    }
}

扩展属性、函数

val Int.isOdd get() = this % 2 != 0


fun Int.print() = print(this)


fun main() {
    println(1.isOdd)
    2.print()
}
true
2

列表(List 和 MutableList)生成

List不可修改元素,MutableList可修改元素。

fun main() {
    val list: List<Int> = listOf(1, 2, 3)
    val mutableList: MutableList<Int> = mutableListOf(1, 2, 3)

    println(list)
    print(mutableList)
}
[1, 2, 3]
[1, 2, 3]

格式列表项

fun main() {
    val list = listOf(1, 2, 3).map { it * 2 }

    print(list)
}
[2, 4, 6]

过滤列表项

fun main() {
    val list = listOf(1, 2, 3).filter { it > 1 }

    print(list)
}
[2, 3]

确认元素是否在集合中

fun main() {
    val list = listOf(1, 2, 3)

    println(1 in list)
    print(4 in list)
}
true
false

Pair 生成

fun main() {
    val pair: Pair<String, Int> = "K2" to 2

    print(pair)
}
(K2, 2)

映射表(Map 和 MutableMap)生成

ListMutableList类似,Map也有MutableMap(与mapOf写法相同)。

fun main() {
    val map: Map<String, String> = mapOf(
        "Kotlin" to ".kt",
        "Java" to ".java",
        "Python" to ".py"
    )

    print(map)
}
{Kotlin=.kt, Java=.java, Python=.py}

可变映射表(MutableMap)值修改

fun main() {
    val mutableMap = mutableMapOf(
        "Kotlin" to ".kt",
        "Java" to ".java"
    )

    mutableMap.put("Python", ".py")

    // 习惯这样写
    mutableMap["C"] = ".c"

	print(mutableMap)
}
{Kotlin=.kt, Java=.java, Python=.py, C=.c}

遍历列表或映射表

fun main() {
    val list = listOf(1, 2)

    println("list for 循环:")
    for (int in list) {
        println(int)
    }
    println()

    println("list forEach 方法:")
    list.forEach {
        println(it)
    }
    println()

    val map: Map<String, String> = mapOf(
        "Kotlin" to ".kt",
        "Java" to ".java"
    )

    println("map for 循环:")
    for ((key, value) in map) {
        println("$key: $value")
    }
    println()

    // 注意,如果不加括号调用的是 Java 代码的 forEach
    // 加了则是 Kotlin 的
    println("map forEach 方法:")
    map.forEach { (key, value) ->
        println("$key: $value")
    }
}
list for 循环:
1
2

list forEach 方法:
1
2

map for 循环:
Kotlin: .kt
Java: .java

map forEach 方法:
Kotlin: .kt
Java: .java

范围(Range)生成式

fun main() {
    for(int in 0..2){
        print("$int ")
    }
    
    println()

    for(long in 0..<2L){
        print("$long ")
    }
}
0 1 2 
0 1 

数据类

我们可以很方便地构建数据结构,并且有附加的、无需自己编写的实用方法。

data class User(val name: String, val password: String)


fun main() {
    print(User("Zhou-Kt", "****"))
}
User(name=Zhou-Kt, password=****)

单例(object)

object Singleton {
    const val NAME = "Singleton"
}


fun main() {
    print(Singleton.NAME)
}
Singleton

匿名对象

fun main() {
    val obj = object {
        private var name = "anonymous"

        fun getName() = name
    }

    print(obj.getName())
}
anonymous

抽象类、接口实例化

abstract class MyClass


interface MyInterface


fun main() {
    val myClass: MyClass = object : MyClass() {}

    val myInterface: MyInterface = object : MyInterface {}
}

内联值类(@JvmInline value class)

@JvmInline
value class Teacher(val id: String)


@JvmInline
value class Student(val id: String)


fun main() {
    print(Student("123") == Student("123"))
    // Teacher("123") == Student("123") 不能这样做
}
true

懒加载(lazy)

object Object1 {
    val lazyName by lazy { println("lazyName 初始化"); "Object" }
    val name = "Object".also { println("name 初始化") }
}


object Object2 {
    val name = "Object".also { println("name 初始化") }
    val lazyName by lazy { println("lazyName 初始化"); "Object" }
}


fun main() {
    // 在两次调用中,name 都被初始化
    // 而 lazyName 仅在使用时初始化
    
    // 此时 lazyName 未被访问,不初始化
    Object1

    // 此时 lazyName 被访问,初始化
    Object2.lazyName
}
name 初始化
name 初始化
lazyName 初始化

run

fun main() {
    val list = listOf(1, 2, 3)

    // run 会提供调用者的 this 引用
    // 并且将 lambda 的返回值作为最终值
    print(list.run { size })
}
3

also

fun main() {
    val list = listOf(1, 2, 3)

    // also 会提供调用者 it 参数给 lambda
    // 最终还是返回调用者
    print(list.also { println(it.size) })
}
3
[1, 2, 3]

apply

class User {
    var name = "default name"
    var password = "default pwd"
}


fun main() {
	// apply 会提供调用者的 this 引用
	// 最终还是返回调用者
    User().apply {
        name = "Zhou-Kt"
        password = "****"
    }
}

上下文提供(with)

class Context {
    fun getString() {}

    fun getInt() {}
}


fun main() {
    with(Context()) {
        getString()
        getInt()
    }
}

try-with-resources

示例来源

import java.nio.file.Files
import java.nio.file.Paths

fun main() {
	val stream = Files.newInputStream(Paths.get("/some/file.txt"))
	stream.buffered().reader().use { reader ->
    	println(reader.readText())
	}
}

交换值

示例来源

fun main() {
	var a = 1
	var b = 2
	a = b.also { b = a }

	print("a: $a b: $b")
}
a: 2 b: 1
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值