<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      kotlin集合——>迭代器、區(qū)間與數(shù)列

      1.迭代器

        對于遍歷集合元素,Kotlin 標(biāo)準(zhǔn)庫支持 迭代器 的常用機(jī)制?對象可按順序提供對元素的訪問權(quán)限,而 不會暴露集合的底層結(jié)構(gòu)。當(dāng)需要逐個處理集合的所有元素(例如打印值或?qū)ζ溥M(jìn)行類似更新)時,迭代 器非常有用。

        Iterable<T> 接口的繼承者(包括 Set 與 List )可以通過調(diào)用 iterator() 函數(shù)獲得迭代器。一 旦獲得迭代器它就指向集合的第一個元素;調(diào)用 next() 函數(shù)將返回此元素,并將迭代器指向下一個元素(如果下一個元素存在)。一旦迭代器通過了最后一個元素,它就不能再用于檢索元素;也無法重新指 向到以前的任何位置。要再次遍歷集合,請創(chuàng)建一個新的迭代器。

      val numbers = listOf("one", "two", "three", "four")
      val numbersIterator = numbers.iterator()
      while (numbersIterator.hasNext()) {
          println(numbersIterator.next())
      }

      遍歷 Iterable 集合的另一種方法是眾所周知的 for 循環(huán)。在集合中使用 for 循環(huán)時,將隱式獲取 迭代器。因此,以下代碼與上面的示例等效

      val numbers = listOf("one", "two", "three", "four")
      for (item in numbers) {
          println(item)
      }

      最后,有一個好用的 forEach() 函數(shù),可自動迭代集合并為每個元素執(zhí)行給定的代碼。因此,等效的示 例如下所示:

      val numbers = listOf("one", "two", "three", "four") 
      numbers.forEach {
          println(it)
      }

        1.1 List迭代器

          對于列表,有一個特殊的迭代器實現(xiàn):ListIterator 它支持列表雙向迭代:正向與反向。反向迭代由 hasPrevious() 和 previous() 函數(shù)實現(xiàn)。此外,ListIterator 通過 nextIndex() 與 previousIndex() 函數(shù)提供有關(guān)元素索引的信息。

      val numbers = listOf("one", "two", "three", "four")
      val listIterator = numbers.listIterator()
      while (listIterator.hasNext()){
      listIterator.next()
      }
      while (listIterator.hasPrevious()) { print("Index: ${listIterator.previousIndex()}") println (", value: ${listIterator.previous()}") }

          具有雙向迭代的能力意味著 ListIterator 在到達(dá)最后一個元素后仍可以使用

        1.2 可變迭代器

          為了迭代可變集合,于是有了 MutableIterator 來擴(kuò)展 Iterator 使其具有元素刪除函數(shù) remove() 。因此,可以在迭代時從集合中刪除元素

      val numbers = mutableListOf("one", "two", "three", "four") 
      val mutableIterator = numbers.iterator()
      mutableIterator.next() 
      mutableIterator.remove() 
      println("After removal: $numbers")

          除了刪除元素,MutableListIterator 還可以在迭代列表時插入和替換元素。

      val numbers = mutableListOf("one", "four", "four") 
      val mutableListIterator = numbers.listIterator()
      
      mutableListIterator.next() 
      mutableListIterator.add("two") 
      mutableListIterator.next() 
      mutableListIterator.set("three") 
      println(numbers)

      2.區(qū)間與數(shù)列

        Kotlin 可通過調(diào)用 kotlin.ranges 包中的 rangeTo() 函數(shù)及其操作符形式的 .. 輕松地創(chuàng)建兩 個值的區(qū)間。通常,rangeTo() 會輔以 in 或 !in 函數(shù)。

      if(i in 1..4){ //等同于1<=i&&i<=4
         print(i)
      }

        整數(shù)類型區(qū)間(IntRange、LongRange、CharRange)還有一個拓展特性:可以對其進(jìn)行迭代。這些區(qū)間也是相應(yīng)整數(shù)類型的等差數(shù)列。這種區(qū)間通常用于 for 循環(huán)中的迭代。

      for (i in 1..4) print(i)

        要反向迭代數(shù)字,請使用 downTo 函數(shù)而不是 .. 。

      for (i in 4 downTo 1) print(i)

        也可以通過任意步?(不一定為 1 )迭代數(shù)字。這是通過 step 函數(shù)完成的。

      for (i in 1..8 step 2) print(i) //輸出 1357
      println()
      for (i in 8 downTo 1 step 2) print(i)//輸出 8642

        要迭代不包含其結(jié)束元素的數(shù)字區(qū)間,請使用 until 函數(shù):

      for (i in 1 until 10) { // i in [1, 10), 10被排除
        print(i)
      }

        2.1 區(qū)間

          區(qū)間從數(shù)學(xué)意義上定義了一個封閉的間隔:它由兩個端點值定義,這兩個端點值都包含在該區(qū)間內(nèi)。區(qū)間是為可比較類型定義的:具有順序,可以定義任意實例是否在兩個給定實例之間的區(qū)間內(nèi)。區(qū)間的主要操作是 contains,通常以 in 與 !in 操作符的形式使用。

          要為類創(chuàng)建一個區(qū)間,請在區(qū)間起始值上調(diào)用 rangeTo() 函數(shù),并提供結(jié)束值作為參數(shù)。 rangeTo() 通常以操作符 .. 形式調(diào)用。

      val versionRange = Version(1, 11)..Version(1, 30)
      println(Version(0, 9) in versionRange)
      println(Version(1, 20) in versionRange)

        2.2 數(shù)列

          如上個示例所示,整數(shù)類型的區(qū)間(例如 Int 、Long 與 Char )可視為等差數(shù)列。在 Kotlin 中,這些數(shù) 列由特殊類型定義:IntProgression、LongProgression 與 CharProgression。

          數(shù)列具有三個基本屬性:first 元素、last 元素和一個非零的 step 。首個元素為 first ,后續(xù)元素是前一個元素加上一個 step。以確定的步?在數(shù)列上進(jìn)行迭代等效于Java/JavaScript中基于索 引的 for 循環(huán)

      for (int i = first; i <= last; i += step) {
           // ......
      }

          通過迭代數(shù)列隱式創(chuàng)建區(qū)間時,此數(shù)列的 first 與 last 元素是區(qū)間的端點,step 為 1

      for (i in 1..10) print(i)

          要指定數(shù)列步?,請在區(qū)間上使用 step 函數(shù)

      for (i in 1..8 step 2) print(i)

          數(shù)列的 last 元素是這樣計算的:

      — 對于正步?:不大于結(jié)束值且滿足 (last - first) % step == 0 的最大值。
      — 對于負(fù)步?:不小于結(jié)束值且滿足 (last - first) % step == 0 的最小值。

          因此,last 元素并非總與指定的結(jié)束值相同

      for (i in 1..9 step 3) print(i) // 最后一個元素是 7

          要創(chuàng)建反向迭代的數(shù)列,請在定義其區(qū)間時使用 downTo 而不是 .. 。

      for (i in 4 downTo 1) print(i)

          數(shù)列實現(xiàn) Iterable<N>,其中 N 分別是 Int、Long 或 Char,因此可以在各種集合函數(shù)(如map、filter 與其他)中使用它們

      println((1..10).filter { it % 2 == 0 })

      3.序列

        除了集合之外,Kotlin 標(biāo)準(zhǔn)庫還包含另一種容器類型?序列(Sequence<T>)。序列提供與 Iterable 相同的函數(shù),但實現(xiàn)另一種方法來進(jìn)行多步驟集合處理。

        當(dāng) Iterable 的處理包含多個步驟時,它們會優(yōu)先執(zhí)行:每個處理步驟完成并返回其結(jié)果?中間集合。在此集合上執(zhí)行以下步驟。反過來,序列的多步處理在可能的情況下會延遲執(zhí)行:僅當(dāng)請求整個處理鏈的結(jié)果時才進(jìn)行實際計算。

        操作執(zhí)行的順序也不同:Sequence 對每個元素逐個執(zhí)行所有處理步驟。反過來,Iterable 完成整 個集合的每個步驟,然后進(jìn)行下一步。

        因此,這些序列可避免生成中間步驟的結(jié)果,從而提高了整個集合處理鏈的性能。但是,序列的延遲性質(zhì) 增加了一些開銷,這些開銷在處理較小的集合或進(jìn)行更簡單的計算時可能很重要。因此,應(yīng)該同時考慮 使用 Sequence 與 Iterable,并確定在哪種情況更適合

      4.構(gòu)造

        4.1 由元素,要創(chuàng)建一個序列,請調(diào)用 sequenceOf() 函數(shù),列出元素作為其參數(shù)

      val numbersSequence = sequenceOf("four", "three", "two", "one")

        4.2 由 Iterable,如果已經(jīng)有一個 Iterable 對象(例如 List 或 Set ),則可以通過調(diào)用 asSequence() 從而創(chuàng)建一個序列。

      val numbers = listOf("one", "two", "three", "four")
      val numbersSequence = numbers.asSequence()

        4.3 由函數(shù),創(chuàng)建序列的另一種方法是通過使用計算其元素的函數(shù)來構(gòu)建序列。要基于函數(shù)構(gòu)建序列,請以該函數(shù)作 為參數(shù)調(diào)用 generateSequence()。(可選)可以將第一個元素指定為顯式值或函數(shù)調(diào)用的結(jié)果。當(dāng)

      提供的函數(shù)返回 null 時,序列生成停止。因此,以下示例中的序列是無限的

      val oddNumbers = generateSequence(1) { it + 2 } // `it` 是上一個元素 
      println(oddNumbers.take(5).toList())
      //println(oddNumbers.count()) // 錯誤:此序列是無限的。

          要使用 generateSequence() 創(chuàng)建有限序列,請?zhí)峁┮粋€函數(shù),該函數(shù)在需要的最后一個元素之后 返回 null

      val oddNumbersLessThan10 = generateSequence(1) { if (it < 10) it + 2 else null } 
      println(oddNumbersLessThan10.count())

        4.4 由組塊,最后有一個函數(shù)可以逐個或按任意大小的組塊生成序列元素sequence( )函數(shù).此函數(shù)采用一個lambda 表達(dá)式,其中包含 yield() 與 yieldAll() 函數(shù)的調(diào)用。它們將一個元素返回給序列使用 者,并暫停 sequence() 的執(zhí)行,直到使用者請求下一個元素。yield() 使用單個元素作為參 數(shù);yieldAll() 中可以采用 Iterable 對象、Iterable 或其他 Sequence 。yieldAll() 的Sequence 參數(shù)可以是無限的。當(dāng)然,這樣的調(diào)用必須是最后一個:之后的所有調(diào)用都永遠(yuǎn)不會執(zhí)行

      val oddNumbers = sequence {
          yield(1)
          yieldAll(listOf(3, 5))
          yieldAll(generateSequence(7) { it + 2 })
      }
      println(oddNumbers.take(5).toList())

      5.序列操作

        關(guān)于序列操作,根據(jù)其狀態(tài)要求可以分為以下幾類:

      — 無狀態(tài)操作不需要狀態(tài),并且可以獨立處理每個元素,例如map()或filter()。無狀態(tài)操作還可能需要少量常數(shù)個狀態(tài)來處理元素,例如 take() 與 drop()。
      — 有狀態(tài)操作需要大量狀態(tài),通常與序列中元素的數(shù)量成比例

        如果序列操作返回延遲生成的另一個序列,則稱為 中間序列。否則,該操作為 末端 操作。末端操作的示 例為 toList() 或 sum()。只能通過末端操作才能檢索序列元素。

        序列可以多次迭代;但是,某些序列實現(xiàn)可能會約束自己僅迭代一次。其文檔中特別提到了這一點。

      6.序列處理示例

        我們通過一個示例來看 Iterable 與 Sequence 之間的區(qū)別

        6.1 Iterable,假定有一個單詞列表。下面的代碼過濾?于三個字符的單詞,并打印前四個單詞的?度

      val words = "The quick brown fox jumps over the lazy dog".split(" ")
      val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
              .map { println("length: ${it.length}"); it.length }.take(4)
      println("Lengths of first 4 words longer than 3 chars:")
      println(lengthsList)

        運行此代碼時,會看到 filter() 與 map() 函數(shù)的執(zhí)行順序與代碼中出現(xiàn)的順序相同。首先,將看到 filter :對于所有元素,然后是 length :對于在過濾之后剩余的元素,然后是最后兩行的輸出。列表處理如下圖

        6.2 Sequence,現(xiàn)在用序列寫相同的邏輯

      val words = "The quick brown fox jumps over the lazy dog".split(" ") 
      // 將列表轉(zhuǎn)換為序列
      val wordsSequence = words.asSequence()
      
      val lengthsSequence = wordsSequence.filter { println("filter: $it"); it.length > 3 }
              .map { println("length: ${it.length}"); it.length }
              .take(4)
      
      println("Lengths of first 4 words longer than 3 chars") // 末端操作:以列表形式獲取結(jié)果。
      println(lengthsSequence.toList())

        此代碼的輸出表明,僅在構(gòu)建結(jié)果列表時才調(diào)用 filter() 與 map() 函數(shù)。因此,首先看到文本 “Lengths of..” 的行,然后開始進(jìn)行序列處理。請注意,對于過濾后剩余的元素,映射在過濾下一個元素之前執(zhí)行。當(dāng)結(jié)果大小達(dá)到 4 時,處理將停止,因為它是 take(4) 可以返回的最大大小

        序列處理如下圖:在此示例中,序列處理需要 18 個步驟,而不是 23 個步驟來執(zhí)行列表操作

        

      posted @ 2020-07-02 15:54  王世楨  閱讀(2220)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产自拍偷拍视频在线观看| 日本不卡码一区二区三区| 亚洲午夜无码久久久久小说| 青青草原国产精品啪啪视频 | 精品国产一区av天美传媒| 国产av成人精品播放| 三级三级三级A级全黄| 日韩一区二区三区在线观院| A级毛片100部免费看| 天堂网亚洲综合在线| 亚洲乱色伦图片区小说| 日韩精品无遮挡在线观看| 日韩高清亚洲日韩精品一区二区| 国产白嫩护士在线播放| 国产国产午夜福利视频| 北岛玲中文字幕人妻系列| 国产热A欧美热A在线视频| 99精品国产高清一区二区麻豆| 中文字幕av一区二区| 国产99在线 | 免费| 久久综合综合久久综合| 久99久热这里只有精品| 亚洲欧美综合一区二区三区| 久久精品国产亚洲av高| 无码国产偷倩在线播放| 久久精品色一情一乱一伦| 人妻少妇偷人作爱av| 国内精品久久人妻无码不卡| 激情伊人五月天久久综合| 国精产品自偷自偷ym使用方法| 日韩精品久久久肉伦网站| 成人无号精品一区二区三区| 国产精品一区二区三区专区| 福利在线视频一区二区| 三上悠亚日韩精品二区| 激情文学一区二区国产区| 日本中文一区二区三区亚洲| 麻豆久久久9性大片| 清水河县| 无码囯产精品一区二区免费| 亚洲欧美精品一中文字幕|