Kotlin之惰性集合操作:序列

在使用集合函數(shù)比如mapfilter街佑。這些函數(shù)會及早的創(chuàng)建中間集合愉棱,也就是說每一步的中間結(jié)果都被存儲在一個臨時列表该贾。而序列給了你另一種選擇琼梆,可以讓你避免創(chuàng)建這些臨時的中間對象性誉。如下一個例子:

val peoples = listOf(Person("Alice",20),Person("Bob",31))
peoples.map(Person::name).filter { it.startsWith("A") }

上面的例子中mapfilter都會返回一個列表,也就是說鏈?zhǔn)降恼{(diào)用會創(chuàng)建兩個列表茎杂,如果源列表中只有兩個元素错览,這不是什么問題,但如果有一百萬個元素煌往,(鏈?zhǔn)?調(diào)用就會變得十分低效倾哺。
為提高效率,可以把操作變成使用序列刽脖,而不是直接使用集合

 peoples.asReversed() <!--把初始集合轉(zhuǎn)換成序列-->
    .map ( People::name )  <!--序列支持和集合一樣的API-->
    .filter {it.startsWith("A") }
    .toList() <!--把結(jié)果序列轉(zhuǎn)換回列表-->

Kotlin惰性集合操作的入口就是Sequence接口羞海,它的強(qiáng)大之處就在于其操作的實(shí)現(xiàn)方式,序列中元素的求值是惰性的曲管。因此可以使用序列高效地對集合元素執(zhí)行鏈?zhǔn)讲僮魅吹耍恍枰獎?chuàng)建額外的集合來保存過程中產(chǎn)生的中間結(jié)果。
可以調(diào)用擴(kuò)展函數(shù)asSequence把任意集合轉(zhuǎn)換成序列院水,調(diào)用toList來做反向的轉(zhuǎn)換

中間和末端操作

序列操作分為兩類:中間和末端腊徙。一次中間操作返回的是另一個序列,這個新序列知道如何變換原始序列中的元素檬某。而一次末端操作返回的是一個結(jié)果

中間操作始終是惰性的撬腾,看看下面這個缺少了末端操作的例子

listOf(1,2,3,4).asSequence()
    .map{print("map ($it)");it * it}
    .filter { print("filter($it)");it % 2 == 0 }

執(zhí)行以上這段代碼不會在控制臺輸出任何內(nèi)容。這意味著mapfilter變換被延期了恢恼,它們只有在獲取結(jié)果的時候caihui被應(yīng)用(即末端操作被調(diào)用的時候)

在使用mapfilter進(jìn)行變換時民傻,先應(yīng)用filter有助于減少變換的次數(shù)。如果map在前场斑,每個元素都被變換漓踢。而如果filter在前,不合適的元素會被盡早地過濾掉且不會發(fā)生變換

創(chuàng)建序列

使用generateSequence函數(shù)創(chuàng)建序列漏隐,給定序列中的前一個元素彭雾,這個函數(shù)會計(jì)算下一個元素

    val naturalNumbers = generateSequence(0){it + 1}
val numberTo100 = naturalNumbers.takeWhile { it <= 100 }
println(numberTo100.sum()) <!--在獲取結(jié)果`sum`時,所有被推遲的操作都被執(zhí)行-->

創(chuàng)建使用父目錄的序列锁保,如果元素的父元素和它的類型相同薯酝,你可能會對它的祖先組成的序列的物質(zhì)感興趣半沽。下面的例子可以查詢文件是否放在隱藏目錄中,通過創(chuàng)建一個其父目錄的序列并檢查每個目錄的屬性來實(shí)現(xiàn)

fun File.isInsideHiddenDirectory() =
    generateSequence(this){ it.parentFile}.any{ it.isHidden }
    
val file = File("/Users/svtk/.HiddenDir/a.txt")
println(file.isInsideHiddenDirectory())
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吴菠,一起剝皮案震驚了整個濱河市者填,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌做葵,老刑警劉巖占哟,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酿矢,居然都是意外死亡榨乎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門瘫筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜜暑,“玉大人,你說我怎么就攤上這事策肝「睾矗” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵之众,是天一觀的道長拙毫。 經(jīng)常有香客問我,道長棺禾,這世上最難降的妖魔是什么缀蹄? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮膘婶,結(jié)果婚禮上袍患,老公的妹妹穿的比我還像新娘。我一直安慰自己竣付,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布滞欠。 她就那樣靜靜地躺著古胆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筛璧。 梳的紋絲不亂的頭發(fā)上逸绎,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音夭谤,去河邊找鬼棺牧。 笑死,一個胖子當(dāng)著我的面吹牛朗儒,可吹牛的內(nèi)容都是我干的颊乘。 我是一名探鬼主播参淹,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乏悄!你這毒婦竟也來了浙值?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檩小,失蹤者是張志新(化名)和其女友劉穎开呐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规求,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筐付,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阻肿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓦戚。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冕茅,靈堂內(nèi)的尸體忽然破棺而出伤极,到底是詐尸還是另有隱情,我是刑警寧澤姨伤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布哨坪,位于F島的核電站,受9級特大地震影響乍楚,放射性物質(zhì)發(fā)生泄漏当编。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一徒溪、第九天 我趴在偏房一處隱蔽的房頂上張望忿偷。 院中可真熱鬧,春花似錦臊泌、人聲如沸鲤桥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茶凳。三九已至,卻和暖如春播揪,著一層夾襖步出監(jiān)牢的瞬間贮喧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工猪狈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箱沦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓雇庙,卻偏偏與公主長得像谓形,于是被迫代替她去往敵國和親灶伊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容