文章目录
本文参考
字符串插值
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)生成
与List
和MutableList
类似,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