溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法

發(fā)布時間:2021-06-25 13:51:05 來源:億速云 閱讀:380 作者:chen 欄目:編程語言

這篇文章主要講解了“Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法”吧!

sequence稱之為序列,也是一種容器類型--(Sequence<T>),序列提供了和迭代器(Iterable)相同的函數(shù),只不過序列的實現(xiàn)方式跟普通的集合處理方式不一樣而已。

首先序列式惰性的,惰性的含義就是我們對序列進行各種一些列的變換的操作的時候,會對序列中的元素依次進行變換并且保存到Sequence對象里面,當我們求情整個處理鏈的結果的時候才會進行最終的計算并且返回對應的結果比如Int、Boolean、List<T>。避免產(chǎn)生了中間步驟的結果,從而提高了整個集合處理鏈的性能。普通的集合在進行變換操作的時候是先遍歷集合中的元素依次處理并且返回一個新的集合然后在此基礎之上再進行其余的操作,最后返回結果,可見其中會產(chǎn)生很多的性能消耗??墒切蛄械难舆t性質也增加了一些消耗,這些開銷在處理在處理較小的集合的時候會顯得很重要了。因此怎么選擇哪種情況更合適顯得很重要。

今天著重記錄了一下序列的基本使用以及sequence()函數(shù)的使用。

我們如果想直接創(chuàng)建一個序列可以這樣直接創(chuàng)建:

val sequence1 = sequenceOf("a", "b", "c")

使用的時候我們可以直接toList進行l(wèi)ist的遍歷等操作。

還可以在List的基礎之上進行轉換序列操作:

val list = listOf("d", "e", "f")val sequence2 = list.asSequence()println(sequence2.toList())

就可以很輕松的進行序列的轉換了。

使用起來比較簡單,重要的就是要了解序列它的實現(xiàn)原理,它跟集合的不同的地方。

還有一種方式我們通過計算函數(shù)的方式來計算序列中元素的構建過程。這時候我們要用到generateSequence()函數(shù)了,它是一個沒有邊界的序列,大小可以無限的生長,知道提供的元素的函數(shù)返回null為止,序列也就停止生成了。

val generateSequence = generateSequence(2) { 
    it * 3}.take(10)println(generateSequence.toList())

其中的2的含義是說我們的序列從2開始然后根據(jù)傳入的函數(shù)參數(shù)規(guī)則進行生成序列元素,我們的這里的規(guī)則就是上一個元素*3就是下一個元素的值。

打印出來如下:

[2, 6, 18, 54, 162, 486, 1458, 4374, 13122, 39366]

這個是最基本的使用方式,我們看到take()函數(shù),它需要我們傳遞一個Int的數(shù)值,告訴序列我取到第十個的時候就停止了,序列也就不會再產(chǎn)生元素了。

點進去發(fā)現(xiàn)其實他返回的還是序列對象:

Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法

說明這個函數(shù)還不是最終的計算方法,返回的還是序列sequence對象,真正最后通過toList之后返回的就是一個集合了:

Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法

最后的返回就是一個集合了,這才是序列最后計算的時刻,同樣的toList函數(shù),這里就是序列的擴展函數(shù)了,使用方法就不一樣了。

還有一種實現(xiàn)方式可以終止函數(shù)的生成,不用take()函數(shù)來終止了,我們可以通過自己定義的元素生成函數(shù)來實現(xiàn):

val generateSequence1 = generateSequence(2){    if((it +3) < 20) it + 3 else null}println(generateSequence1.toList())

打印如下:

[2, 5, 8, 11, 14, 17]

當生成的元素小于20的時候函數(shù)就會直接返回null,那么序列就停止生成了。

最后呢,我記錄了一下yield()函數(shù),翻譯過來是生產(chǎn)、產(chǎn)生的意思,那就顧名思義了。

使用方法看看這個例子:

val sequence = sequence {    val start = 0    yield(start) // 依次放入序列之中 0    yieldAll(1..5 step 2) // 1、3、5    yieldAll(generateSequence(8) { it * 3 }) //8、24、72}

yield函數(shù)是對序列生產(chǎn)一個元素,放入序列之中,并且暫停sequence()函數(shù)執(zhí)行,直到下一個請求函數(shù)元素到來。

首先我們先往序列里面放入0這個元素,然后又放入一個list,規(guī)則step函數(shù) 1、3、5集合,最后通過generateSequence()通過函數(shù)生成元素并且最后我們take(7),取前七個為止輸出如下:

[0, 1, 3, 5, 8, 24, 72]

ok!

感謝各位的閱讀,以上就是“Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法”的內容了,經(jīng)過本文的學習后,相信大家對Kotlin sequence序列生成以及generateSequence()、yield()函數(shù)的使用方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI