Kotlin學習(二)—— 基本文法,函數,變數,字串模板,條件運算式,null,類型檢測,for,while,when,區間,集合,kotlinnull
一.基本文法
Kotlin的很多概念跟JAVA是有類似的,所以我應該不會像我的JAVA之旅一樣那麼的詳細,但是不用擔心,你會看的很明白的,我也是根據官方的文檔來學習的
我們在IDEA中建立一個項目Kotlin02
1.函數(fun)
我們預設有一個主函數,就是main了
fun main(args: Array<String>) { print("主函數")}
和JAVA一樣,他就是程式的主入口了,當然,我們還有普通的函數
fun sum(): Unit { print("無參 無返回")}fun sum() { print("一般Unit可以省略")}fun sum(a: Int) { print("有參 無返回")}fun sum(): Int { print("無參 有返回") return 0;}fun sum(a: Int): Int { print("有參 有返回") return 0;}
這裡就可以對Kotlin的函數有一個比較清晰的認識了,首先,我們的無參 無返回中有一個Unit,這個就是標誌
這個函數沒有傳回值,和JAVA中的void是一樣的,而且我們一般是可以省略掉的,並且這裡要注意下的就是他的函數傳值
是先定義變數,再用冒號去指向類型,如a:Int b:String,並且傳回值也是用冒號去指向的,如:Int
並且我們還可以將運算式作為函數體、傳回值類型⾃動推斷的函數,如:
fun sum(a: Int, b: Int) = a + b;
2.變數(val&var)
變數分三種,局部變數,頂層變數和可變變數
但是就兩個修飾符val 和 var
//定義Int類型的變數 val a: Int = 1 //定義變數 自動識別類型,如果不指定類型,就必須賦值 val b = 2 //沒有初始值,不可操作 val c: Int //賦值 val修飾只能賦值一次 c = 3
用val修飾符修飾之後,只能一次賦值後就編程唯讀變數了,在JAVA中可以理解為常量,這裡怎麼理解呢,可以說是JAVA中用final修飾一樣,我們來舉個例子
//報錯 val a: Int print(a + 2 ) //正確 a = 3 print(a)
這裡的意思就是我定義一個Int類型的a,然後輸出a + 2,編譯器會提示錯誤,因為val修飾後無值,不可操作,然後我給他賦值= 3,就可以正確輸出了
這裡還有一點要注意的就是,我們可以 val c: Int這樣定義一個變數,先不賦值,但是如果你不指定值又不定義類型,比如val a,那是錯誤的,編譯器無法得知你需要做什麼操作
我們再來看下可變變數,用法是一樣的,但是注意的事,他是可變的
var a: Int = 2 print(a) a++; print("a:" + a)
這裡就可以明白,a輸入2,然後a++,輸出3
還有最後一種頂層變數,頂層變數其實就是JAVA中的全域變數,這個沒什麼可說的
//頂層val x = 2var y = 3fun sum() { y++ print(x + y)}
這個就沒什麼好說的了
3.字串模板($)
字串模板也是比較簡單的,就是字元引用,我們來看一段例子
val boy = 5 var girl = 7 var all = "班級共有男孩:$boy 人,女孩:$girl 人" print(all)
然後run一下,輸出
可以看出,這裡我輸出的時候就引用了變數boy和girl,只需要前面加上$即可,有點類似於JAVA中的逸出字元
當然,還有一些更加進階的用法,比如
val boy = 5 var girl = 7 var all = "班級共有男孩:$boy 人,女孩:$girl 人" //print(all) //將男孩替換成女孩 print("${all.replace("男孩","女孩")},現在班級的所有女生共有:${boy + girl}" )
這裡我們可以看到輸出
也就是說,我們可以直接操作,當然,本質上這樣轉義跟下面這樣並沒有什麼區別
print(all.replace("男孩","女孩") + ",現在班級的所有女生共有:" + (boy + girl))
你覺得哪種方便呢?
4.條件運算式(if else)
//比較大小fun maxOf(a: Int, b: Int): Int { if (a > b) { return a } else { return b }}
if else 一直都是這種寫法,當然,簡單判斷的話,我們還可以這樣去寫
fun maxOf(a: Int, b: Int) = if (a > b) a else b
5.可空值及 null 檢測(?)
還記得我們在java中怎麼去寫函數的嘛?比如
private String testOf(String x){ String y = null; //通過一些邏輯的操作 if(!TextUtils.isEnty(y)){ y = x; } return y;}
這是一段JAVA代碼,我們可以看到,如果我們通過邏輯操作後可以讓y賦值,但是也同樣的,有存在有可能返回null的情況,但是在kotlin中,我們需要特殊處理
fun parseInt(str: String): Int? { return null;}
這裡注意,如果傳回值有可能為空白的話,需要標記?問號,不然你return null會報錯
6.類型檢測及⾃動類型轉換(is)
類型檢測在JAVA中都是用instanceof來處理,在kotlin中,可以用is,我們看一個例子
var a:Any = "123" if(a is String){ print(a.length) }
在這段代碼中,我說明一下,Any是所有類都有一個共同的父類,類似於Object,但是他的神通沒有Object大
而在這段代碼中,首先,我用is判斷了String,這裡可不僅是判斷,而且還類型轉換了,所以為true的話,就可以輸出a.length了,但是在沒有調用is之前,實際上是沒有length這個方法的
7.for迴圈(for in)
var a = listOf(1, 2, 3, 1) for (b in a) { //錯誤 //print(b + "\n") print("$b \n") }
這段代碼中,我們定義了一個list為a,然後通過in去for迴圈,這裡我要說一下,就是字串模板的應用情境。
比如輸出的結果需要換行,那麼print(b + “\n”)你這樣用+號是錯誤的,需要print(“$b \n”),在Kotlin中,in負責for迴圈,即最大次數為list長度
當然,如果你想問,那我想知道下標是多少怎麼辦?
var a = listOf(1, 2, 3, 1) for (b in a.indices) { print("item:" + b + "值" + a[b] + "\n") }
實際上in只是提供迴圈的手段而已,真正要迴圈的東西,還是要自己決定,所以這裡,我就迴圈list的下標a.indices
這樣我就可以拿到下標以及對應的值,也是一樣的,當然,這個輸出我們可以用更官方的寫法來寫的:
print("item:$b 值${a[b]}\n")
一樣,我們可以看到列印
8.while迴圈(while)
var a = 0; while (a < 10) { a++; print(a) }
while迴圈沒什麼好講的,你按照正常的來就好了
9.when運算式(when)
var x = 1; var y = 1; when (x) { 1 -> if(x + y > 5){ print("a") }else{ print("b") } 2 -> print("x == 2") else -> { // 注意這個塊 print("x is neither 1 nor 2") } }
從這段代碼大家可以看出一些東西來吧,沒錯,實際上Kotlin中的when運算式就是JAVA中的switch語句塊 -> 相當於case
10.區間(range)
val x = 5 if (x in 1..10) { println("fits in range") }
我們通過int可以判斷x是否在1-10的區間,當然,區間的用法還是比較多的,比如數列迭代等,這些我們後面會詳細講到
11.集合
集合在我們上面for迴圈的時候就已經出現過
var a = listOf(1, 2, 3, 1) for (b in a) { print("$b \n") }
集合的用處很廣泛,我們在後面還會細講,這裡舉一個例子:
/** * 有一堆水果和一堆投票員 * 每個投票員手中有1-3張票不等 * 且他們每個人只喜歡一種水果 * 如果投票員吃到的這個水果就會給你投票 * 如果總分超過5分 * 那你就順便合格 * 我們假設5個投票員,3個水果 * 請問他是否合格? */ //放出3個水果 var fruit = listOf("香蕉", "蘋果", "西瓜") //分數 var fractions = 0; for (fr in fruit) { if (fr is String) { when (fr) { "龍眼" -> { print("+1 \n") fractions = fractions + 1; } "香蕉" -> { print("+2 \n") fractions = fractions + 2; } "橘子" -> { print("+2 \n") fractions = fractions + 2; } "蘋果" -> { print("+2 \n") fractions = fractions + 2; } "西瓜" -> { print("+1 \n") fractions = fractions + 1; } } } } //計算是否合格 if (fractions > 5) { print("合格") } else { print("不合格") }
我們先看下輸出結果
這個題出的有點粗糙,大家看的懂就行,意思就是我們只有三種水果給到三個喜歡吃的投票員,他會給我相應的分數,最後超過5分就合格,然後我們來分析下這個題目
首先我們定義了一個集合fruit來表示我當前的水果,然後我定義fractions來進行分數的累加,開始迴圈並且判斷誰喜歡吃,給幾分,最後判斷是否大於5,
題目很簡單,但是我們的邏輯也是從這裡開始萌發的
這些大概就是Kotlin的大致介紹了,實際上這門美麗的語言不止是這些內容,當你已經瞭解了這些之後,我們就可以進行下一個環節,正在的開始沒一個知識點的細講了
如果有興趣的話,可以來Github參與一下
我的公眾號,期待你的關注
查看評論