安卓系列之 kotlin 基础知识(一)_android kotlin downto

24 阅读3分钟
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 表达式

  1. 相当于 Java 的 switch case 语句
  2. 分支条件可以多个,可以是基础数据,也可以是表达式
when (obj) {
    1,2 -> "number"
    "hello" -> "string"
    is Long -> "Long"
    !is String -> "Not a string"
    else -> "Unknown"
} 

字符串相关

  1. $ 符号加变量名引用
val a: Int = 1
val s1 = "a is $a" 

  1. ${}可以引用表达式
var a = 1
val s1 = "a is $a"
a = 2
val s2 = "${s1.replace("is", "was")},but now is $a" 

  1. 多行字符串
    三个引号 “”" 扩起来的字符串
//有一些前置空格
val text1 = """
    多行字符串
    多行字符串"""
    
//去除空格,从字符串中每行的开头裁剪指定的字符串参数以及前面的全部空格,如果不提供参数,则以|作为参数默认值
val text2 = """
    |多行字符串
    |多行字符串""".trimMargin("|")

//去除前导空格,切割每一行开头相同数量的空格
val text3 = """
    |多行字符串
    |多行字符串""".trimIndent() 

  1. 字符串截取
    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类型 

  1. 字符串切片
    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) 

  1. 字符串替换
    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
   }
} 

  1. 字符串比较
    \ ==表示内容是否相同,相当于 Java 的 equal;
    \ ===表示内存堆是否相同,相当于 Java 的 ==;
//字符串比较
val textD = "hello"
val textE = "hello"
print(textD == textE)//ture
print(textD === textE)//ture 

  1. 字符串遍历
    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
    }
} 

最后

本文在开源项目GitHub中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

目前已经更新的部分资料,需要的自己取: