变量
- 格式
变量定义关键字 变量名:引用类型=值
var a: String = "hello"
- var
可修改变量
可以用 lateinit 修饰,延迟初始化变量 - val
只读变量,并非不可变
只能赋值一次的变量
局部变量是一个普通变量时,val 相当于 Java 中 final
类型推断
已赋值的变量(包括函数变量)可以省略类型,kotlin 会自动类型推断
变量
函数变量
const 关键字
- 相当于 Java 的 public final static
- 编译时常量
- 只能修饰类属性和顶层属性
in 关键字
range 表达式的关键字
- in -> 表示在某个区间
- !in -> 表示不在某个区间里
- step -> 步长
- downTo -> 倒数
- until -> 排除结束元素
for (i in 1..3) print(i)//输出“123”
for (i in 3 downTo 1) print(i) // 打印结果为: "321"
//使用step指定步长
for (i in 1..4 step 2) print(i) //输出“13”
//倒数
for (i in 4 downTo 1 step 2) print(i) //输出“42”
//使用until函数排除结束元素
for (i in 1 until 4) { //i in [1, 4) 排除了4
println(i)
}
is 关键字
如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换
- !is -> 不是
- is -> 是
fun getStringLength(obj: Any): Int? {
if (obj is String) {
return obj.length
}
return null
}
when 表达式
- 相当于 Java 的 switch case 语句
- 分支条件可以多个,可以是基础数据,也可以是表达式
when (obj) {
1,2 -> "number"
"hello" -> "string"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
字符串相关
- $ 符号加变量名引用
val a: Int = 1
val s1 = "a is $a"
- ${}可以引用表达式
var a = 1
val s1 = "a is $a"
a = 2
val s2 = "${s1.replace("is", "was")},but now is $a"
- 多行字符串
三个引号 “”" 扩起来的字符串
//有一些前置空格
val text1 = """
多行字符串
多行字符串"""
//去除空格,从字符串中每行的开头裁剪指定的字符串参数以及前面的全部空格,如果不提供参数,则以|作为参数默认值
val text2 = """
|多行字符串
|多行字符串""".trimMargin("|")
//去除前导空格,切割每一行开头相同数量的空格
val text3 = """
|多行字符串
|多行字符串""".trimIndent()
- 字符串截取
substring 关键字,用于截取字符串功能,可用 range 类型
//字符串截取
val textA = "Hello,There is a good message."
val indexO = textA.indexOf(",")
val firstText = textA.substring(0, indexO)
val twiceText = textA.subSequence(0 until indexO)//支持rang类型
- 字符串切片
split 关键字,通过某个指定的符号切为 list
//字符串切片
val textB = "num1,num2,num3"
val dataB = textB.split(",")
print("dataB[0]:" + dataB[0] + "dataB[1]:" + dataB[1] + "dataB[2]:" + dataB[2])
val (dataB0, dataB1, dataB2) = textB.split(",")//支持解构
print("dataB0:" + dataB0 + "dataB1:" + dataB1 + "dataB2:" + dataB2)
- 字符串替换
replace 关键字,指定符号去替代字符串指定位置的内容
//字符串替换
val textC = "Hello,There is a good message."
val dataC = textC.replace("e", "1")
//支持正则表达式和匿名函数
val dataCTwo = textC.replace(Regex("eo")) {
when (it.value) {
"e" -> "1"
"o" -> "2"
else -> it.value
}
}
- 字符串比较
\ ==表示内容是否相同,相当于 Java 的 equal;
\ ===表示内存堆是否相同,相当于 Java 的 ==;
//字符串比较
val textD = "hello"
val textE = "hello"
print(textD == textE)//ture
print(textD === textE)//ture
- 字符串遍历
forEach 关键字,用于遍历每一个字符
//字符串遍历
val textF = "Hello,There is a good message."
textF.forEach {
print(it)
}
数据类型转换
//安全转化
"1.23".toIntOrNull()
"1".toDoubleOrNull()
//取整
1.23.toInt()
//四舍五入
1.2345.roundToInt()
//转换成字符串
".2%".format(1.234567)
空安全相关
?=(可空类型)
格式:
变量定义关键字 变量名:引用类型? = 值
var b: String? = null
?.(安全调用操作符)
若是可空变量为空,则不执行后续方法,若不为空则执行
格式:
变量.?方法
var b: String? = null
b = "elaine"
print(b?.length)
- 支持链式调用
var b: String? = null
b = "elaine"
print(b?.substring(2)?.length)
let(安全调用)
let 函数,可以对变量进行重定义
/**
* let安全调用
*/
var letTwo: String? = null
var letTwoResult = letTwo?.let {
if (it.isEmpty()) {
"数据为空"
} else {
it
}
}
!!.(非空断言操作符)
若可空变量不为空则执行后续方法,若可空变量为空则会抛出 NPE(nullPointerException)
var b: String? = null
b = "elaine"
print(b!!.length)
?:(空合并操作符)
又名三目条件操作符,相当于 Java 的 if 条件语句的简写
var b: String? = null
b = "elaine"
print(b?.length ?: 0)
//Java 简写
int a = 0;
int c = a > 0 ? a : -2;
kotlin 调用 java 的代码
kotlin 调用 java 的代码,因为这样的调用破坏了 Null 安全性机制,所以需要加上?
fun testThree() {
print(PageTwo.getMsg()?.length)
}
class PageTwo {
public static String getMsg() {
return null;
}
}