Kotlin 學(xué)習(xí)筆記

1拇厢、Kotlin 中沒有基礎(chǔ)數(shù)據(jù)類型,都是用它的包裝類型辈末,他的包裝類型是一個(gè)類愚争,我們可以使用類里面很多有用的方法映皆。

2、kotlin訪問修飾符

訪問修飾符可以修飾類轰枝,也可以修飾類的成員捅彻。

(1)類訪問修飾符


(2)類成員訪問修飾符


有幾點(diǎn)需要講一下:

? ? ? ? ? ?1、 internal 修飾符是 Kotlin 獨(dú)有而 Java 中沒有的鞍陨;

? ? ? ? ? ?2步淹、protected 修飾符在Kotlin和Java中的異同點(diǎn)

? ? ? ? ? ? ? ? protected 修飾類,在 Java 中該類只能被同包名下的類訪問诚撵,Kotlin 中就算是同包名的類也不能訪問 protected 修飾的類缭裆。

? ? ? ? ? ? ? ? ?protected 修飾類成員,在 Java 中可以被同包名或子類可訪問寿烟;在 Kotlin 中只能被子類訪問澈驼。

訪問修飾符小結(jié):

(1)如果不寫訪問修飾符,在 Java 中是 default 修飾符 (package-private)筛武;在 Kotlin 中是 public 的

(2)internal 訪問修飾符是 Kotlin 獨(dú)有缝其,只能在模塊內(nèi)能訪問的到

(3)protected 修飾類的時(shí)候,不管是 Java 和 Kotlin 都只能放到內(nèi)部類上

(4)在 Kotlin 中徘六,要繼承 protected 類内边,要么子類在同一內(nèi)部類名下;要么該類的的外部類和 protected 類的外部類有繼承關(guān)系

(5)在 Kotlin 中待锈,繼承 protected 類假残,子類也必須是 protected 的

(6)在 Kotlin 中,對(duì)于 protected 修飾符炉擅,去掉了同包名能訪問的特性

(7)如果某個(gè) Kotlin 類能夠被繼承,需要 open 關(guān)鍵字阳惹,默認(rèn)是 final 的

3谍失、新建 bean 類的時(shí)候,常常需要聲明 equals莹汤、hashCode快鱼、toString 等方法,我們需要寫很多代碼纲岭。在 Kotlin 中抹竹,只需要在聲明類的時(shí)候前面加 data 關(guān)鍵字就可以完成這些功能。

4止潮、kotlin 新建內(nèi)部類,例如:

class OuterClass {

? ? //在 Kotlin 中內(nèi)部類默認(rèn)是靜態(tài)的窃判,不持有外部類的引用

? ? class InnerStaticClass{

? ? }

? ? //如果要聲明非靜態(tài)的內(nèi)部類,需要加上 inner 關(guān)鍵字

? ? inner class InnerClass{

? ? }

}

編譯后代碼如下:

class OuterClass {

? public static final class InnerStaticClass {

? }

? public final class InnerClass {

? }

}

5喇闸、companion object

companion object?稱之為伴生對(duì)象袄琳,伴生體里面放的是一些靜態(tài)成員:如靜態(tài)常量询件、靜態(tài)變量、靜態(tài)方法唆樊。例如

companion object {

? ? //公有常量

? ? const val FEMALE: Int = 0

? ? const val MALE: Int = 1

? ? //私有常量

? ? val GENDER: Int = FEMALE

? ? //私有靜態(tài)變量

? ? var username: String = "chiclaim"


? ? //靜態(tài)方法

? ? fun run() {

? ? ? ? println("run...")

? ? }

}


6宛琅、Kotlin 中的 Interface

在 Java8 之前,Interface 中是不能包含有方法體的方法和屬性逗旁,只能包含抽象方法和常量嘿辟。

在 Kotlin 中的接口在定義的時(shí)候可以包含有方法體的方法,也可以包含屬性片效。例如

//聲明一個(gè)接口红伦,包含方法體的方法 plus 和一個(gè)屬性 count

interface InterfaceTest {

? ? var count: Int

? ? fun plus(num: Int) {

? ? ? ? count += num

? ? }

}

//實(shí)現(xiàn)該接口

class Impl : InterfaceTest {

? ? //必須要覆蓋 count 屬性

? ? override var count: Int = 0

}

7、lambda 表達(dá)式

在 Java8 之前堤舒,lambda 表達(dá)式在 Java 中都是沒有的色建。

(1)lambda 總是放在一個(gè)花括號(hào)里 ({})

(2)箭頭左邊是 lambda 參數(shù) (lambda parameter)

(3)箭頭右邊是 lambda 體 (lambda body)

8、高階函數(shù)


如果某個(gè)函數(shù)是以另一個(gè)函數(shù)作為參數(shù)或者返回值是一個(gè)函數(shù)舌缤,我們把這樣的函數(shù)稱之為高階函數(shù)箕戳。

例如:

//Kotlin library filter function

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T>

//調(diào)用高階函數(shù) filter,直接傳遞 lambda 表達(dá)式

list.filter { person ->

? ? person.age > 18

}


function type:

名稱 : (參數(shù)) -> 返回值類型

(1)冒號(hào)左邊是?function type?的名字

(2)冒號(hào)右邊是參數(shù)

(3)尖括號(hào)右邊是返回值

比如:predicate: (T) -> Boolean?predicate 就是名字国撵,T 泛型就是參數(shù)陵吸,Boolean 就是返回值類型

高階函數(shù)是以另一個(gè)函數(shù)作為參數(shù)或者其返回值是一個(gè)函數(shù),也可以說高階函數(shù)參數(shù)是?function type?或者返回值是?function type

在調(diào)用高階函數(shù)的時(shí)候介牙,我們可以傳遞 lambda壮虫,這是因?yàn)榫幾g器會(huì)把 lambda 推導(dǎo)成?function type


9、高階函數(shù) let环础、with囚似、apply、run( 內(nèi)聯(lián)函數(shù) ) 總結(jié)

(1)let 函數(shù)一般用于判斷是否為空

//let 函數(shù)的定義

public inline fun <T, R> T.let(block: (T) -> R): R {

? ? return block(this)

}

//let 的使用

message?.let { //lambda參數(shù)it是message

? ? val result = it.substring(1)

? ? println(result)

}

(2)?with 是全局函數(shù)线得,apply 是擴(kuò)展函數(shù)饶唤,其他的都一樣

(3)run 函數(shù)的 lambda 是一個(gè)帶有接受者的 lambda,而 let 不是贯钩,除此之外功能差不多

10募狂、Kotlin泛型

Java 泛型:不變性 (invariance)、協(xié)變性 (covariance)角雷、逆變性 (contravariance)

Kotlin泛型:協(xié)變祸穷、逆變

Kotlin 泛型擦除和具體化

Kotlin 和 Java 的泛型只在編譯時(shí)有效,運(yùn)行時(shí)會(huì)被擦除 (type erasure)勺三。例如下面的代碼就會(huì)報(bào)錯(cuò):

//Error: Cannot check for instance of erased type: T

//fun <T> isType(value: Any) = value is T


Kotlin 提供了一種泛型具體化的技術(shù)雷滚,它的原理是這樣的:

我們知道泛型在運(yùn)行時(shí)會(huì)擦除,但是在 inline 函數(shù)中我們可以指定泛型不被擦除吗坚,

因?yàn)?inline 函數(shù)在編譯期會(huì) copy 到調(diào)用它的方法里揭措,所以編譯器會(huì)知道當(dāng)前的方法中泛型對(duì)應(yīng)的具體類型是什么胯舷,

然后把泛型替換為具體類型,從而達(dá)到不被擦除的目的绊含,在 inline 函數(shù)中我們可以通過 reified 關(guān)鍵字來標(biāo)記這個(gè)泛型在編譯時(shí)替換成具體類型

如下面的代碼就不會(huì)報(bào)錯(cuò)了:

inline fun <reified T> isType(value: Any) = value is T

11桑嘶、Kotlin 集合

Kotlin 中的集合底層也是使用 Java 集合框架那一套。在上層又封裝了一層?可變集合?和?不可變集合?接口躬充。


(1)聲明可變集合


(2)聲明不可變集合


Kotlin 集合常用的 API

1) all逃顶、any、count充甚、find以政、firstOrNull、groupBy 函數(shù)


2) filter伴找、map盈蛮、flatMap、flatten 函數(shù)


延遲集合操作之 Sequences(Sequence就是就是為了避免創(chuàng)建多余的集合的問題技矮。)

val list = listOf<Person>(Person("chiclaim", 18), Person("yuzhiqiang", 15),

? ? ? ? Person("johnny", 27), Person("jackson", 190),

? ? ? ? Person("pony", 85))


//把 filter 函數(shù)放置前面抖誉,可以有效減少 map 函數(shù)的調(diào)用次數(shù)

list.asSequence().filter { person ->

? ? println("filter---> ${person.name} : ${person.age}")

? ? person.age > 20

}.map { person ->

? ? println("map----> ${person.name} : ${person.age}")

? ? person.age

}.forEach {

? ? println("---------符合條件的年齡 $it")

}

Sequence 的原理圖如下所示:


對(duì) Sequence 做一個(gè)小結(jié):

(1)如果集合的數(shù)據(jù)量很大啊,可以使用集合操作的延遲 Sequence

(2)Sequence 的 filter衰倦、map 等擴(kuò)展還是是一個(gè)非 inline 的高階函數(shù)

(3)集合的 Sequence 只有調(diào)用 forEach袒炉、toList 等操作,才會(huì)觸發(fā)對(duì)集合的操作樊零。有點(diǎn)類似 RxJava我磁。

12、Koltin 和 Java 交互的一些問題

1) Kotlin 和 Java 交互上關(guān)于空的問題

2) 關(guān)于 Kotlin 基本類型初始化問題

3) Kotlin 泛型具體化無法被 Java 調(diào)用

? ? 如果我們定義了一個(gè) inline 函數(shù)驻襟,且使用了泛型具體化夺艰,該方法不能被 Java 調(diào)用。反編譯后發(fā)現(xiàn)該方法是私有的沉衣。只能Kotlin 代碼自己調(diào)用郁副。

4) Kotlin 間接訪問 Java default class

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厢蒜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烹植,老刑警劉巖斑鸦,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異草雕,居然都是意外死亡巷屿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門墩虹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘱巾,“玉大人憨琳,你說我怎么就攤上這事⊙眩” “怎么了篙螟?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)问拘。 經(jīng)常有香客問我遍略,道長(zhǎng),這世上最難降的妖魔是什么骤坐? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任绪杏,我火速辦了婚禮,結(jié)果婚禮上纽绍,老公的妹妹穿的比我還像新娘蕾久。我一直安慰自己,他們只是感情好拌夏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布僧著。 她就那樣靜靜地躺著,像睡著了一般辖佣。 火紅的嫁衣襯著肌膚如雪霹抛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天卷谈,我揣著相機(jī)與錄音杯拐,去河邊找鬼。 笑死世蔗,一個(gè)胖子當(dāng)著我的面吹牛端逼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播污淋,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼顶滩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了寸爆?” 一聲冷哼從身側(cè)響起礁鲁,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赁豆,沒想到半個(gè)月后仅醇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魔种,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年析二,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叶摄,死狀恐怖属韧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛤吓,我是刑警寧澤宵喂,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站柱衔,受9級(jí)特大地震影響樊破,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唆铐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一哲戚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艾岂,春花似錦顺少、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至氓辣,卻和暖如春秒裕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞啸。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工几蜻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人体斩。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓梭稚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親絮吵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弧烤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345