一、元组
1.1、二元元组
data class Pair<out A, out B>(
public val first: A,
public val second: B
) : Serializable
使用如下:
//声明1
val a=Pair<Int,String>(125,"Hello")
println(a.first)//125 获取第一个值
println(a.second)//Hello 获取第二个值
val message = a.toList()//转换为集合
println(message)//[125, Hello]
//声明2:使用 to 声明
val b=125 to "Hello"
println(b.first)//125 获取第一个值
println(b.second)//Hello 获取第二个值
// 声明3:指定接受值
val (x,y)=Pair<Int,String>(125,"Hello")
println(x)//125 获取第一个值
println(y)//Hello 获取第二个值
1.2、三元元组
data class Triple<out A, out B, out C>(
public val first: A,
public val second: B,
public val third: C
) : Serializable
使用如下:
//声明1
val a = Triple<Int, Boolean, String>(125, true, "Hello")
println(a.first)//125 第一个值
println(a.second)//true 第二个值
println(a.third)//Hello 第三个值
println(a.toList())//[125, true, Hello] 转换为集合
//声明2
val (i, b, s) = Triple<Int, Boolean, String>(125, true, "Hello")
println("i=$i,b=$b,s=$s")//i=125,b=true,s=Hello
二、空安全
2.1、空值问题
val str: String? = null
//1、非空断言 !! ,不管是否为空,直接调用 不建议使用
// val length = str!!.length//“!!”强行放弃了非空判断
// println(length)//kotlin.KotlinNullPointerException
//2、空安全调用符 ?. ,如果为空,则直接返回null 如果不为空,则返回长度
val length= str?.length
println(length)//null
//3、Elvis运算符 ?: , 下面案例:如果为空返回-1 否则返回值
val str2:Int = str?.toInt()?:-1
//相当于
// if(str!=null){
// return str.toInt()
// }else{
// return -1
// }
println(str2)//-1
2.2、空安全转换(as?)
val a: Any = "Hello"
// as 类型转换。 转换失败抛出异常
//val aInt: Int = a as Int//java.lang.ClassCastException
//as? 如果转换失败则返回null 不会抛错
val bInt: Int? = a as? Int
println(bInt)//null
三、接收键盘输入
kotlin接收键盘输入使用readLine()
var m:Int
var n:Int
println("请输入m的值")
m= readLine()?.toInt()?:-1
println("请输入n的值")
n= readLine()?.toInt()?:-1
println("m+n=${m+n}")
// 请输入m的值
// 1
// 请输入n的值
// 2
// m+n=3
四、条件控制语句if
- if可以作为语句也可以作为表达式。当 if不作为语句,而是表达式,将返回值赋值给变量,则必须要else分支。
- if表达式可以实现三元运算符效果,具备返回值,然后赋值给变量。
- if表达式作为块,可以包含其他表达式,但最后一个表达式是该块的值。
fun main(args: Array<String>) {
//求两个数的最大值
val a: Int = 2
val b: Int = 5
println(max(a, b))//5
}
//求最大值 kotlin没有三元运算符
//fun max(a:Int,b:Int):Int{
// if(a>b){
// return a
// }else{
// return b
// }
//}
//如果只有一行 可以去掉{}
//fun max(a:Int,b:Int):Int{
// if(a>b)
// return a
// else
// return b
//
//}
//去除if 中的return
//fun max(a: Int, b: Int): Int {
// return if (a > b) a else b
//}
//函数还可以精简为函数表达式
fun max(a: Int, b: Int) = if (a > b) a else b
五、repeat简单循环执行(高阶函数)
repeat循环执行一些重复的任务.
inline fun repeat(times: Int, action: (Int) -> Unit)
//简单的循环执行打印
repeat(3){
println(it)//0 1 2
}
六、for循环和foreach循环
val str = "abc"
/*--------------------------for循环------------------------------*/
//不打印角标
for (c in str) {
println(c)//a
}
// 打印角标
for ((index, c) in str.withIndex()) {
println("$index-----$c") // 0-----a
}
/*--------------------------forEach循环------------------------------*/
//不打印角标
str.forEach {
println(it)//a
}
//打印角标
str.forEachIndexed { index, c ->
println("$index-----$c")//0-----a
}
七、返回处理
7.1、continue、break、return
val str = "abc"
//打印结果 a c
for (c in str) {
if (c == 'b') {
continue
}
println(c)
}
//打印结果 a
for (c in str) {
if (c == 'b') {
break
}
println(c)
}
//forEach中不能使用 continue break 可以使用return ,打印结果 a
str.forEach {
if (it == 'b') {
return
}
println(it)
}
7.2、标签处返回
val str1 = "abc"
val str2 = "123"
//打印结果 c=a,c1=1 c=a,c1=2 c=a,c1=3
tag@ for (c in str1) {
for (c1 in str2) {
if (c == 'b') {
break@tag
}
println("c=$c,c1=$c1")
}
}
//打印结果 c=a,c1=1
tag2@ for (c in str1) {
tag3@ for (c1 in str2) {
if (c == 'b') {
continue@tag2
}
if (c1 == '2') {
return@tag3
}
println("c=$c,c1=$c1")
}
}
//forEach标签处返回
val c = 0..9
c.forEach {
if (it == 5) {
return@forEach
}
println(it)//0 1 2 3 4 6 7 8 9
}
八、while和do while循环
/*--------------------------while--------------------------*/
//打印结果 1 2 3 4 5 while 是先判断再执行
var a = 1
while (a <= 5) {
println(a)
a++
}
/*-------------------------- do while--------------------------*/
//打印结果 6 do……while 是先执行再做判断
var b=6
do {
println(b)
b++
}while (b<=5)
九、when表达式
when 可以用任意表达式(而不只是常量)作为分支条件,可以用任意表达式(而不只是常量)作为分支条件;可以检测一个值是(is)或者不是(!is)一个特定类型的值(由于智能转换,你可以访问该类型的方法和属性而无需任何额外的检测);可以用来取代if-else-if链。如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支:
9.1、简单使用
val age = 18
println(todo(age))//开始上大学
fun todo(age: Int): String {
when (age) {
7 -> {
return "开始上小学"
}
12 -> {
return "开始上中学"
}
15 -> {
return "开始上高中"
}
18 -> {
return "开始上大学"
}
else -> {
return "未知"
}
}
}
9.2、when表达式加强
val age = 13
println(todo2(age))//上中学
fun todo2(age: Int): String {
when (age) {
// is Int -> {//是Int类型
//
// }
in 0..6 -> {//在区间里面
return "在家玩"
}
7 -> {
return "开始上小学"
}
in 7..11 -> {//在区间里面
return "上小学"
}
12 -> {
return "开始上中学"
}
13, 14 -> {//多条件合并
return "上中学"
}
15 -> {
return "开始上高中"
}
16, 17 -> {//多条件合并
return "上高中"
}
18 -> {
return "开始上大学"
}
else -> {
return "未知"
}
}
}
9.3、when表达式不带参数
val age = 15
/**
* kotlin里面的when表达式原理:
* 简单的when表达式通过switch语句实现
* 复杂的when表达式通过if else来实现
*/
println(todo3(age))//开始上高中
fun todo3(age: Int): String {
when {
age in 0..6 -> {//在区间里面
return "在家玩"
}
age == 7 -> {
return "开始上小学"
}
age in 7..11 -> {//在区间里面
return "上小学"
}
age == 12 -> {
return "开始上中学"
}
age == 13 || age == 14 -> {//多条件合并
return "上中学"
}
age == 15 -> {
return "开始上高中"
}
age == 16 || age == 17 -> {//多条件合并
return "上高中"
}
age == 18 -> {
return "开始上大学"
}
else -> {
return "未知"
}
}
}
9.4、when表达式返回值
val age = 11
/**
* when表达式返回值在{}最后一行 lambda表达式最后一行为返回值
*/
println(todo4(age))//上小学
fun todo4(age: Int): String {
return when (age) {
in 0..6 -> {
"在家玩"//在区间里面
}
7 -> {
"开始上小学"
}
in 7..11 -> {
"上小学"
}
12 -> {
"开始上中学"
}
13, 14 -> {
"上中学"
}
15 -> {
"开始上高中"
}
16, 17 -> {
"上高中"
}
18 -> {
"开始上大学"
}
else -> {
"未知"
}
}