<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### filter函數 接下來我們再來學習另外一個比較常用的函數式API——**filter函數。顧名思義,filter函數是用來過濾集合中的數據的,它可以單獨使用,也可以配合剛才的map函數一起使用**。 **filter 函數可以從集合中移除你不想要的元素,但是它并不會改變這些元素。元素的變換是map 的用武之地。** 比如我們只想保留5個字母以內的水果,就可以借助filter函數來實現,代碼如下所示: ~~~ fun main() { val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon") val newList = list.filter { it.length <= 5 } .map { it.toUpperCase() } for (fruit in newList) { println(fruit) } } ~~~ 可以看到,**這里同時使用了filter和map函數,并通過Lambda表示式將水果單詞長度限制在5個字母以內**。重新運行一下代碼,結果如圖2.27所示。 ![圖像說明文字](http://epub.ituring.com.cn/api/storage/getbykey/screenshow?key=200301e60b1c9fc32914) 另外值得一提的是,上述代碼中**我們是先調用了filter函數再調用map函數。如果你改成先調用map函數再調用filter函數,也能實現同樣的效果,但是效率就會差很多,因為這樣相當于要對集合中所有的元素都進行一次映射轉換后再進行過濾,這是完全不必要的。而先進行過濾操作,再對過濾后的元素進行映射轉換,就會明顯高效得多**。 下面我們看另一個示例 ~~~ data class PersonData(val name: String, val age: Int, val sex: String, val score: Int) fun main(args: Array<String>) { val jilen = PersonData("Jilen", 30, "m", 85) val shaw = PersonData("Shaw", 18, "m", 90) val yison = PersonData("Yison", 40, "f", 59) val jack = PersonData("Jack", 30, "m", 70) val lisa = PersonData("Lisa", 25, "f", 88) val pan = PersonData("Pan", 36, "f", 55) val persons = listOf(jilen, shaw, yison, jack, lisa, pan) val mPersons = persons.filter { it.sex == "m" } for (p in mPersons) { println(p) } } ~~~ 輸出結果如下 ``` PersonData(name=Jilen, age=30, sex=m, score=85) PersonData(name=Shaw, age=18, sex=m, score=90) PersonData(name=Jack, age=30, sex=m, score=70) ``` 上面的代碼定義了一個人組成的列表,接下來我們會圍繞這個人列表來介紹一下Kotlin中豐富的集合API。 假設現在我們要獲取一份由所有男人組成的列表。按照以前的思路,我們可以先定義一個新的列表,然后遍歷students,將滿足條件的項添加到新列表中去。但是,在Kotlin中我們不用這么去做,Kotlin為我們提供了一個filter方法,我們來使用一下: ``` val mPersons = persons.filter { it.sex == "m" } ``` **通過使用filter方法,我們就篩選出了男人**。該方法**與map類似,也是接收一個函數,只是該函數的返回值類型必須是Boolean。該函數的作用就是判斷集合中的每一項是否滿足某個條件,如果滿足,filter方法就會將該項插入新的列表中,最終就得到了一個滿足給定條件的新列表**。 #### filter源碼 ~~~ public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { return filterTo(ArrayList<T>(), predicate) } ~~~ ~~~ public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo(destination: C, predicate: (T) -> Boolean): C { for (element in this) if (predicate(element)) destination.add(element) return destination } ~~~ 可以看到,filter方法的實現主要是依賴于filterTo,filterTo接收兩個參數,第1個參數destination為一個列表(該方法最終要返回的列表,初始時為空的列表),第2個參數predicate: (T) -> Boolean是一個返回值類型為Boolean的函數,該函數就是我們在使用filter的時候傳入的Lambda表達式。可以看到,filterTo的實現非常簡單,就是通過遍歷給定的列表,將每一個元素傳入predicate函數中,如果返回值為true就保留,反之則丟棄,最終返回一個滿足條件的新列表。 通過查看filter的結果我們可以知道,**調用filter之后產生的新列表是原來列表的子集**。 具有過濾功能的方法還有以下這些: * filterNot,用來過濾掉滿足條件的元素。**filterNot方法與filter方法的作用相反,當傳入的條件一樣時,會得到相反的結果**。 ``` val fStudents = students.filterNot {it.sex == "m"} ``` * filterNotNull,用來過濾掉值為null元素。 * count,統計滿足條件的元素的個數。 比如,我們要統計男女學生各自的人數,那么就可以使用count方法: ``` val countMStudent = students.count {it.sex == "m"} val countFStudent = students.count {it.sex == "f"} ``` 這里,我們還有另外一種方式可以得到上面的結果: ``` val countMStudent = students.filter {it.sex == "m"}.size val countFStudent = students.filter {it.sex == "f"}.size ``` 但是**這種方式會有一個問題,就是我們需要先通過filter得到一個滿足條件的新列表,然后再去統計該新列表的數量,這樣就增加了額外的開銷**。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看