注:编码工具为IntelliJ
目录
空安全机制
安全调用操作符:?
非空断言操作符:!!
字符串为空示例:
字符串不为空示例:
if判空:和Java一样
空合并操作符:?:
异常
普通异常
自定义异常
先决条件函数
checkNotNull
requireNotNull
require
字符串
substring
split
replace
==和===
遍历
与数字互相转换
内置函数
apply
let
run
with
also
takeIf
takeUnless
内置函数小结
空安全机制
Kotlin定义任意数据类型变量,默认是不可空类型,不能赋值null给该变量。
Kotlin定义任意数据类型可空变量,需要在数据类型后面加问号(?),如:var str: String? = null。
示例:
fun main() {
var str = "string"
// str = null // 编译器报错:Null can not be a value of a non-null type String
var nullTypeStr: String? = null
nullTypeStr = str
println(nullTypeStr)
}
输出:
string
安全调用操作符:?
访问可空数据类型变量的方法或属性,可以用安全类型操作符?,如果该变量为空,则不会继续访问方法或属性,直接返回null,反之,则会继续访问方法或属性。
package step_three
fun main() {
var str: String? = null
println(str?.length)
str = "Hi"
println(str?.length)
}
输出:
null
2
非空断言操作符:!!
访问可空数据类型变量的方法或属性,可以用非空断言操作符!!,如果该变量为空,则直接抛出空指针异常,反之,则会访问方法或属性。
字符串为空示例:
fun main() {
var str: String? = null
println(str!!.length)
}
输出:
Exception in thread "main" java.lang.NullPointerException
at step_three.ExclamationMarkKt.main(ExclamationMark.kt:5)
at step_three.ExclamationMarkKt.main(ExclamationMark.kt)
字符串不为空示例:
fun main() {
var str: String? = "DearMe"
println(str!!.length)
}
输出:
6
if判空:和Java一样
fun main() {
var str: String? = null
if(str != null)
{
println(str)
}else{
println("null")
}
}
输出:
null
空合并操作符:?:
当空合并操作符前面的语句执行结果为空时,返回操作符后面的语句执行结果。
fun calc(i: Int): String? = if(i > 8) "yes" else null
fun main() {
println(calc(8) ?: "Weekend")
}
输出:
Weekend
异常
普通异常
fun main() {
try{
TODO("ANiang")
}catch (e: Exception){
e.printStackTrace()
}
}
输出:
Exception in thread "main" kotlin.NotImplementedError: An operation is not implemented: ANiang
at step_three.ExceptionTestKt.main(ExceptionTest.kt:8)
at step_three.ExceptionTestKt.main(ExceptionTest.kt)
自定义异常
import java.lang.IllegalArgumentException
class CustomException: IllegalArgumentException("参数非法")
fun checkException(num: Int): Int{
if(num !in 1..100){
throw CustomException()
}
return num + 10000
}
fun main() {
try{
checkException(101)
}catch (e: CustomException){
println("custom msg is $e")
}
}
输出:
custom msg is step_three.CustomException: 参数非法
先决条件函数
先决条件函数用于判断条件是否满足或者变量是否为null的。
checkNotNull
fun main() {
var str: String? = null
checkNotNull(str)
}
输出:
Exception in thread "main" java.lang.IllegalStateException: Required value was null.
at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt:5)
at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt)
requireNotNull
fun main() {
var str: String? = null
requireNotNull(str)
}
输出:
Exception in thread "main" java.lang.IllegalArgumentException: Required value was null.
at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt:5)
at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt)
require
fun main() {
var str: String? = null
require(str != null)
}
输出:
Exception in thread "main" java.lang.IllegalArgumentException: Failed requirement.
at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt:5)
at step_three.BuiltInCheckExceptionFuncKt.main(BuiltInCheckExceptionFunc.kt)
字符串
substring
fun main() {
val msg = "java.lang.IllegalArgumentException"
println(msg.substring(0, 4))
println(msg.substring(5 until 9))
println(msg.substring(10))
println(msg.substring(0..10))
}
输出:
java
lang
IllegalArgumentException
java.lang.I
split
fun main() {
var str = "What Do I Call You"
val list = str.split(" ")
list.forEach(::println)
val(e1, e2, e3, e4) = list
println("---------------------")
println("e1:$e1, e2:$e2, e3:$e3, e4:$e4")
println(list)
}
输出:
What
Do
I
Call
You
---------------------
e1:What, e2:Do, e3:I, e4:Call
[What, Do, I, Call, You]
replace
const val ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
fun main() {
val encodeResult = ALPHABET.replace(Regex("[AHORUX]")){
when(it.value){
"A" -> "5"
"H" -> "4"
"O" -> "3"
"R" -> "7"
"U" -> "0"
"X" -> "1"
else -> it.value
}
}
println(encodeResult)
val decodeResult = encodeResult.replace(Regex("[013457]")){
when(it.value){
"5" -> "A"
"4" -> "H"
"3" -> "O"
"7" -> "R"
"0" -> "U"
"1" -> "X"
else -> it.value
}
}
println(decodeResult)
}
输出:
5BCDEFG4IJKLMN3PQ7ST0VW1YZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
==和===
==相当于Java的equals方法。
===相当于Java的==。
fun main() {
val str = "Hope"
val str2 = "Hope"
val str3 = "hope".capitalize()
println(str == str2)
println(str == str3)
println(str === str2)
println(str === str3)
}
输出:
true
true
true
false
遍历
fun main() {
ALPHABET.forEach{
print("$it ")
}
println()
println(ALPHABET.first())
println(ALPHABET[25])
}
输出:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A
Z
与数字互相转换
fun main() {
val i = 99
val istr = "10000"
val dstr = "99.99"
val d = 887.878
println(i.toString())
println(istr.toIntOrNull())
println(istr.toDouble())
println(dstr.toIntOrNull()) // 浮点型字符串不能转换为整型
println(dstr.toFloat())
println(dstr.toDouble())
println(d.toInt())
println("%.2f".format(d)) // 将浮点型数据格式化为保留两位小数的字符串
}
输出:
99
10000
10000.0
null
99.99
99.99
887
887.88
内置函数
apply
apply函数返回的是调用者本身。
apply后面跟匿名函数,则会将调用者本身传进匿名函数,并用this指代。
apply函数可以将函数引用作为参数。
fun main() {
println("code".apply {
println(this.length)
println(count { it == 'a' })
println(first())
println(this[length - 1])
})
println("code".apply(::println))
}
输出:
4
0
c
e
code
code
code
let
let函数返回的是匿名函数或者函数引用的返回值。
let后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。
let函数可以将函数引用作为参数。
fun main() {
println("vision".let {
println(it.first())
println(it.lastIndex)
true
})
println("flyme".let(::println))
}
输出:
v
5
true
flyme
kotlin.Unit
run
run函数返回的是匿名函数或者函数引用的返回值。
run后面跟匿名函数,则会将调用者本身传进匿名函数,并用this指代。
run函数可以将函数引用作为参数。
fun main() {
println("2021-10-31 16:05:13".run {
println(length)
println(count(){it == '3'})
"this is result from anonymous function"
})
println("2021-10-31 16:06:08".run(::println))
}
输出:
19
2
this is result from anonymous function
2021-10-31 16:06:08
kotlin.Unit
with
除了调用方式不一样,其他和run函数一样。with通过将调用者作为参数进行运作。
fun main() {
println(with("Struggle") {
println(toUpperCase())
"OK"
})
println(with("Fashion", ::println))
}
输出:
STRUGGLE
OK
Fashion
kotlin.Unit
also
also函数返回的是调用者本身。
also后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。
also函数可以将函数引用作为参数。
fun main() {
println("salang".also {
println(it.capitalize())
println(it.length)
println(it.toUpperCase())
})
println("Enough".also(::println))
}
输出:
Salang
6
SALANG
salang
Enough
Enough
takeIf
takeIf函数返回值取决于匿名函数或者函数引用的返回值,如果返回值为true,则返回调用者本身,否则,返回null。
takeIf后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。
takeIf函数可以将函数引用作为参数。
fun main() {
val name = "admin"
val pwd = "123"
println(name.takeIf {
it == "admin" && pwd == "123456"
} ?: "error")
}
输出:
error
takeUnless
takeUnless函数返回值取决于匿名函数或者函数引用的返回值,如果返回值为false,则返回调用者本身,否则,返回null。
takeUnless后面跟匿名函数,则会将调用者本身传进匿名函数,并用it指代。
takeUnless函数可以将函数引用作为参数。
fun main() {
var str : String? = null
println(str.takeUnless { str.isNullOrBlank() } ?: "demo")
}
输出:
demo
内置函数小结
内置函数
函数名 | 指代 | 返回值 |
apply | this | 调用者本身 |
let | it | 匿名函数或函数引用返回值 |
run | this | 匿名函数或函数引用返回值 |
with | this | 匿名函数或函数引用返回值 |
also | it | 调用者本身 |
takeIf | it | 匿名函数或函数引用返回true,返回调用者本身,否则,返回null |
takeUnless | it | 匿名函数或函数引用返回false,返回调用者本身,否则,返回null |