Bootstrap

Kotlin学习笔记三、字符串String及操作

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中常用的校验字符串为空的有以下几个方法:

  1. isNullOrempty():为空指针、字符串长度为0时返回true,非空串与可空串均可调用;
  2. isNullOrBlank():为空指针,字符串长度为0,全部为空格时返回true,非空串与可空串均可调用;
  3. isEmpty():字符串长度为0,只有非空串可调用;
  4. isNotEmpty():字符串长度大于0时返回true,只有非空串可以调用;
  5. isBlank():字符串长度为0、全部为空格时返回true,只有非空串可调用;
  6. 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引入了空安全的概念,并在编译的实话开始对变量是否为空的校验,相关的操作符说明如下:

  1. 声明变量实例时,在类名称后面加?,表示该变量可以为空;
  2. 调用变量方法时,在变量名称后面加?,表示一旦变量为空就返回null;
  3. 新引入运算符“?:”,表示一旦变量为空,就返回该运算符右边的表达式,类似Java的三目运算,条件为false的时候,就执行”:”右边的表达式;
  4. 引入新运算符“!!”,通知编译器不做非空校验。如果运行时发现变量为空,就抛出异常。
;