Kotlin實戰(三)
阿新 • • 發佈:2018-12-19
Kotlin實戰(三)
一、元組
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
[email protected] for (c in str1) {
for (c1 in str2) {
if (c == 'b') {
break@tag
}
println("c=$c,c1=$c1")
}
}
//列印結果 c=a,c1=1
[email protected] for (c in str1) {
[email protected] 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 -> {
"未知"
}
}