国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Kotlin】函數(shù)式編程 ③ ( 早集合與惰性集合 | 惰性集合-序列 | generateSequence 序列創(chuàng)建函數(shù) | 序列代碼示例 | take 擴展函數(shù)分析 )

這篇具有很好參考價值的文章主要介紹了【Kotlin】函數(shù)式編程 ③ ( 早集合與惰性集合 | 惰性集合-序列 | generateSequence 序列創(chuàng)建函數(shù) | 序列代碼示例 | take 擴展函數(shù)分析 )。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。





一、及早集合與惰性集合



及早集合 與 惰性集合 :

  • 及早集合 : Eager Collection , 指的是 List , Map , Set 等集合 , 這些集合創(chuàng)建后 , 需要 將元素提前存儲到集合中 , 然后才能訪問 ;
  • 惰性集合 : Lazy Collection , 在 集合剛創(chuàng)建時不必將集合元素放進去 , 當使用這些元素時才生成 , 這些 集合元素按需產(chǎn)生 ;

在 惰性集合 中 集合元素的 初始化 是 惰性初始化 ;





二、惰性集合-序列



Kotlin 中提供了一個 惰性集合 , 稱為 序列 Sequence ;

在 序列 中 , 不記錄元素個數(shù) , 也 不對其內(nèi)容進行排序 , 在該 <font color=bluegreen序列中 元素可能有無限多個 ;

序列中的元素 是由 數(shù)據(jù)源 產(chǎn)生的 , 其元素個數(shù) 可能有無限多個 ;





三、generateSequence 序列創(chuàng)建函數(shù)




1、函數(shù)簡介


“generateSequence” 函數(shù) 是 Kotlin 標準庫 中的一個函數(shù),屬于 Kotlin 的 序列生成器

“generateSequence” 函數(shù) 可以生成一個 惰性序列,并且支持從指定的序列中生成元素。

生成的序列是惰性的,意味著 請求元素時,才會 生成相應的元素。這使得開發(fā)者可以在 不需要處理整個序列的情況下,處理序列中的元素。


2、函數(shù)原型


Kotlin 提供的 " generateSequence " 標準庫函數(shù) , 原型如下 :

/**
 * 返回由起始值[seed]和函數(shù)[nextFunction]定義的序列,每次迭代時,該函數(shù)被調(diào)用以根據(jù)前一個值計算下一個值
 *
 * 序列產(chǎn)生值,直到遇到第一個null值。
 * 如果[seed]是null,則生成一個空序列。
 * 
 * 該序列可以多次迭代,每次都從[seed]開始。
 *
 * @see kotlin.sequences.sequence
 *
 * @sample samples.collections.Sequences.Building.generateSequenceWithSeed
 */
@kotlin.internal.LowPriorityInOverloadResolution
public fun <T : Any> generateSequence(seed: T?, nextFunction: (T) -> T?): Sequence<T> =
    if (seed == null)
        EmptySequence
    else
        GeneratorSequence({ seed }, nextFunction)
  • seed: T? 參數(shù) : 該參數(shù)是 序列的第一個元素值 , 初始值 , 又稱為隨機種子 ;
  • nextFunction: (T) -> T? 參數(shù) : 該參數(shù)是一個 匿名函數(shù) / Lambda 表達式 / 閉包 , 可以 根據(jù)前一個值計算出下一個值 ;

3、函數(shù)簡介


Kotlin 的 generateSequence 函數(shù)是一種 生成序列 的方法,它可以生成 可迭代的、有限或無限的序列。


generateSequence 函數(shù) 接收兩個參數(shù):

  • 起始值 seed
  • 生成下一個值的 匿名函數(shù) nextFunction。

每次迭代時,nextFunction 都會被調(diào)用以生成下一個值,并且該序列會不斷生成值,直到遇到第一個 null 值。如果起始值為 null,那么將會生成一個空序列。

該序列可以 多次迭代,每次都從起始值開始。這是因為 generateSequence 返回一個實現(xiàn)了 Sequence 接口的對象,這意味著你可以 在多次迭代之間重用該序列。

通過使用 generateSequence,你可以簡化代碼,提高可讀性和可維護性,并且可以 生成更復雜的序列,如斐波那契數(shù)列、自然數(shù)序列等。


4、使用示例


使用方法 : 使用 “generateSequence” 函數(shù) 并 傳遞一個函數(shù)作為參數(shù) ; 函數(shù)必須返回 “Nullable” 類型的值,當序列不再生成元素時返回 “null”。

“generateSequence” 函數(shù) 是一種高效且靈活的 生成序列 的方法,它可以用于許多應用程序,如 生成指定數(shù)量的元素、生成無限循環(huán)的序列等。


示例 : 以下代碼生成一個從 1 開始的整數(shù)序列:

val sequence = generateSequence(1) { it + 1 }
println(sequence.take(10).toList()) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]




四、序列代碼示例



取 從 2 開始的 前 20 個 素數(shù) ;


1、使用傳統(tǒng)的函數(shù)式編程實現(xiàn)


代碼示例 : 下面的代碼中 , 從 1 ~ 1000 的區(qū)間內(nèi)查找素數(shù) , 必須將 1000 個元素的集合生成出來 , 然后逐個遍歷 ;

/**
 * 為 Int 定義擴展函數(shù), 判斷接收者是否是素數(shù)
 */
fun Int.isPrimeNumber(): Boolean {
    // number 參數(shù)是被遍歷的 接收者集合 的 受檢元素
    // 符合下面的要求 才會被放入新集合
    // 遍歷時每個 受檢元素 都要 被 [2..number - 1] 區(qū)間的數(shù)值進行遍歷
    val isPrimeNumber = (2..this - 1)
        // 計算 number 與 [2..number - 1] 區(qū)間中的數(shù)值 相除的 余數(shù)
        // 也就是驗證 是否 只有 1 和 其本身 可以被其整除
        .map { this % it }
        // 通過 map 變換計算出的余數(shù)
        // 不能出現(xiàn) 余數(shù) 為 0 的情況
        // 一旦出現(xiàn) 就返回 false
        .none{it == 0}
    return isPrimeNumber
}

fun main() {
    val numbers = (2..1000)
        .toList()   // 將 IntRange 轉(zhuǎn)為 List 集合
        .filter { it.isPrimeNumber() }  // 篩選出集合中是素數(shù)的人
        .take(20) // 從篩選出來的數(shù)值中取 20 個元素

    println(numbers)
}

執(zhí)行結(jié)果 :

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]

kotlin generatesequence,Kotlin,kotlin,惰性集合,序列,Sequence,及早集合


2、使用序列 Sequence 實現(xiàn)


使用傳統(tǒng)方式實現(xiàn)素數(shù)查找 , 如 : 從 1 ~ 1000 的區(qū)間內(nèi)查找素數(shù) , 必須將 1000 個元素的集合生成出來 , 然后逐個遍歷 ;

如果使用 序列 Sequence 實現(xiàn) , 則 只需要實現(xiàn)需要的部分 , 沒有遍歷的元素不會生成 ;


代碼示例 :

/**
 * 為 Int 定義擴展函數(shù), 判斷接收者是否是素數(shù)
 */
fun Int.isPrimeNumber(): Boolean {
    // number 參數(shù)是被遍歷的 接收者集合 的 受檢元素
    // 符合下面的要求 才會被放入新集合
    // 遍歷時每個 受檢元素 都要 被 [2..number - 1] 區(qū)間的數(shù)值進行遍歷
    val isPrimeNumber = (2..this - 1)
        // 計算 number 與 [2..number - 1] 區(qū)間中的數(shù)值 相除的 余數(shù)
        // 也就是驗證 是否 只有 1 和 其本身 可以被其整除
        .map { this % it }
        // 通過 map 變換計算出的余數(shù)
        // 不能出現(xiàn) 余數(shù) 為 0 的情況
        // 一旦出現(xiàn) 就返回 false
        .none{it == 0}
    return isPrimeNumber
}

fun main() {
    val numbers = generateSequence(2) { it + 1 }    // 設置初始值為 2 , 然后每次值自增 1
        .filter { it.isPrimeNumber() }  // 遍歷序列元素 , 查詢是否是素數(shù)
        .take(20)   // 取前 20 個素數(shù)

    println(numbers)
}

執(zhí)行結(jié)果 :

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]

kotlin generatesequence,Kotlin,kotlin,惰性集合,序列,Sequence,及早集合


3、take 擴展函數(shù)分析


下面是 普通集合 調(diào)用的 take 擴展函數(shù) 原型序列 Sequence 調(diào)用的 take 擴展函數(shù) 的對比 , 兩個 函數(shù) 是不同的 , take 函數(shù)決定了 取值的個數(shù) ;

序列 Sequence 調(diào)用 take 函數(shù)時 , take 函數(shù)調(diào)用了序列的部分內(nèi)容 , 決定了 序列 Sequence 的執(zhí)行次數(shù) , 生成多少元素 , 如 : 上述代碼示例中 take 函數(shù)取夠了 20 個素數(shù) , 之后 Sequence 就不再繼續(xù)生成后續(xù)元素了 ;


普通集合 調(diào)用的 take 擴展函數(shù) 原型 和 序列 Sequence 調(diào)用的 take 擴展函數(shù) 的對比 :文章來源地址http://www.zghlxwxcb.cn/news/detail-784245.html

  • 普通集合 調(diào)用的 take 擴展函數(shù) 原型 :
/**
 * Returns a list containing first [n] elements.
 * 
 * @throws IllegalArgumentException if [n] is negative.
 * 
 * @sample samples.collections.Collections.Transformations.take
 */
public fun <T> Iterable<T>.take(n: Int): List<T> {
    require(n >= 0) { "Requested element count $n is less than zero." }
    if (n == 0) return emptyList()
    if (this is Collection<T>) {
        if (n >= size) return toList()
        if (n == 1) return listOf(first())
    }
    var count = 0
    val list = ArrayList<T>(n)
    for (item in this) {
        list.add(item)
        if (++count == n)
            break
    }
    return list.optimizeReadOnlyList()
}
  • 序列 Sequence 調(diào)用的 take 擴展函數(shù) 原型 :
/**
 * Returns a sequence containing first [n] elements.
 *
 * The operation is _intermediate_ and _stateless_.
 * 
 * @throws IllegalArgumentException if [n] is negative.
 * 
 * @sample samples.collections.Collections.Transformations.take
 */
public fun <T> Sequence<T>.take(n: Int): Sequence<T> {
    require(n >= 0) { "Requested element count $n is less than zero." }
    return when {
        n == 0 -> emptySequence()
        this is DropTakeSequence -> this.take(n)
        else -> TakeSequence(this, n)
    }
}

到了這里,關于【Kotlin】函數(shù)式編程 ③ ( 早集合與惰性集合 | 惰性集合-序列 | generateSequence 序列創(chuàng)建函數(shù) | 序列代碼示例 | take 擴展函數(shù)分析 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包