1、像Java那样,字符串String转换成其他数据类型:
var int:String = "1";
var long = "20";
var float = "22.23";
var double = "32.15";
var boolean = "true";
var chars = "asdf"
var integer:Int = int.toInt();
var longInteger = long.toLong();
var decimals = float.toFloat()
var doubleDecimals = double.toDoubleOrNull();
var bool = boolean.toBoolean()
var charArray = chars.toCharArray()
println(TAG + "\nString转int:" + integer + "\nString转long:" + longInteger +
"\nString转float:" + decimals + "\nString转double:" + doubleDecimals +
"\nString转boolean:" + bool + "\nString转chars:" + charArray)
2、字符串的常用方法:
跟Java一样,kotlin 也有很多字符串的操作方法,常用的有:
查找indexOf():查找到指定字符串,那么返回字符串所在的开始位置。没查找到则返回-1;
替换replace() :按指定字符替换;
分割splite():这里要注意的是:Java的Splite操作符返回的结果是一个String[]的数组,而kotlin的Splite操作符返回的结果是一个String型的list列表;
截取substring():同Java一样,包前不包后。
var content = "操作字符串"
println("按钮的提示内容是:" + content)
var result = content.indexOf("字")
println("字符串--字--查找的结果:" + result)
println("这是根据查找到的内容所在的开始位置开始截取的信息:" + content.substring(0, result))
var strList:List<String> = content.split("字")
var newStr:String = "";
for (item in strList){
newStr = newStr + item + "-"
}
if (newStr.endsWith("-")){
newStr = newStr.substring(0, newStr.length-1)
}
println("经split操作符分割后重新组建的字符串的内容为:" + newStr)
var copyString = content.replace("操作", "获取并处理")
println("经replace操作符处理后的字符串内容是:" + copyString)
println("字符串直接通过下标方式获取到的内容:" + copyString[3] + " 通过get()方式获取到的内容:" + copyString.get(3))
字符串包含的判断
字符串是否包含另一个子字符串,字符串A是否包含字符串B的内容,字符串B是否是字符串A的子类,有两种方式判断:
一是关键字“in”,二是关键字“contains”:
val value= "asd"
val string = "asdfghjkl"
if (value in string){
println("value是string的子字符串")
}
if (string.contains(value)){
println("value是string的子字符串")
}
运行结果如下:
3、字符串的拼接:
Java中的拼接,用“+”强制拼接的时候,对于不同数据类型的内容拼接操作很不友好,如果用格式化的方式拼接的话,则是要记住各种格式转换符:%d,%f,%s,%c,%b等等。
Kotlin语言中,字符串的拼接不用像Java中那样复杂,就一个操作符走天下:$。示例如下:
var str01 = "操作-符串"
var str02= "获取并处理字符串"
var jointStr = "$str01,$str02"
println("这两个字符串拼接在一起将会是什么样的:$jointStr")
4、空安全:
a、字符串的空判断
开发中让我们最抓狂的莫过于各种防不胜防的异常处理,包括空指针异常NullPointException、数组越界异常IndexOutOfBoundsException、数据类型转换异常ClassCastException/ NumberFormatException等等。特别是空指针异常NullPointException让人焦头烂额,kotlin中常用的校验字符串为空的有以下几个方法:
- isNullOrempty():为空指针、字符串长度为0时返回true,非空串与可空串均可调用;
- isNullOrBlank():为空指针,字符串长度为0,全部为空格时返回true,非空串与可空串均可调用;
- isEmpty():字符串长度为0,只有非空串可调用;
- isNotEmpty():字符串长度大于0时返回true,只有非空串可以调用;
- isBlank():字符串长度为0、全部为空格时返回true,只有非空串可调用;
- isNotBlank():字符串长度大于0且不是全空格串时返回true,只有非空串可调用;
b、声明可空变量
声明一个可空变量就相当于Java里面创建一个对象,但是不通过关键字new去完成初始化:
StringBuffer sb;
或者:
StringBuffer sb = null;
这样单纯的声明变量但是没有完成初始化直接使用,那么就很容易引发NullPointException空指针异常。在kotlin里面,则可以避免这种情况出现——声明一个可空变量:
var strCanNull:String?
就这样,就完成了一个可空字符串变量的声明。举例说明:
var str01:String = "我是有值的"
var str02:String? = null
var str03:String? = "可空的字符串"
var length01 = str01.length
// 带“?”方式声明的的变量,使用的时候需要注意在该变量后面带上“? ”标识,否则开发环境会爆红,无法通过IDE编译
var length02 = str02?.length
var length03 = str03?.length
logging("str01字符串的长度:$length01, str02字符串的长度:$length02,str03字符串的长度:$length03")
logging("空字符串用于比较:${str02.equals("22")}")
logging("空字符串用于字符串拼接:${str02 + "我的晓晓"}")
// 空字符串用于截取操作str02.substring(0,2)的时候,开发环境会爆红,提示你进行非空判断。
if (str02 != null) {
logging("空字符串用于截取:${str02.substring(0,2)}")
}
//如果不想判断的话,可以这么写,也不会崩溃,也不会抛异常。
logging("不判断空的情况,直接进行空字符串用于截取:${str02?.substring(0, 2)}")
//因为str01定义的时候就已经确定了他不会是空的,所以使用的时候不用判断,也不用加?标识符
logging("空字符串用于截取:${str01.substring(0,2)}")
str01 = null.toString()
// 经过下面的这几轮测试,我们发现,str01经null.toString()操作后,str01实际上是一个"null"这样的字符串,
// 而且kotlin里面,经过非空赋值操作后,字符串型变量就不再允许进行null的赋值,比如如下操作都是不允许的:
str01=null/str01:String? = null。
//但可以进行str01=""操作,然后引发未知异常,这一点需要特别注意
logging("str01变为null.toString的结果是啥:$str01")
logging("str01变为null.toString后是个空字符串还是空对象str01==null:${str01==null}")
logging("str01变为null.toString后是个空字符串str01==\"null\":${str01=="null"}")
logging("str01变为null.toString后是个空字符串str01.equals(\"null\"):${str01.equals("null")}")
//虽然不可以进行null的赋值操作,但是可以进行""的赋值操作,然后引发未知异常,这一点需要特别注意。
str01 = ""
//然后下面的代码就会走catch分支
try {
logging("str01字符串进行截取操作:${str01.substring(0,1)}")
}catch (e:Exception){
logging("对str01=\"\"字符串进行截取操作抛出异常")
e.printStackTrace()
}
总结,kotlin引入了空安全的概念,并在编译的实话开始对变量是否为空的校验,相关的操作符说明如下:
- 声明变量实例时,在类名称后面加?,表示该变量可以为空;
- 调用变量方法时,在变量名称后面加?,表示一旦变量为空就返回null;
- 新引入运算符“?:”,表示一旦变量为空,就返回该运算符右边的表达式,类似Java的三目运算,条件为false的时候,就执行”:”右边的表达式;
- 引入新运算符“!!”,通知编译器不做非空校验。如果运行时发现变量为空,就抛出异常。