Kotlin集合接口

Kotlin 集合概述

Kotlin 集合提供了對數據進行各種操作的便捷方式。它們實現了接口,因此可以操作不同類型的數據。例如,你可以編寫一個函數,同時打印 SetList 的所有元素。我們來看看這是如何實現的。


Iterable 接口

我們已經知道,Kotlin 中有兩個通用接口:IterableMutableIterable,它們提供了一系列用于處理元素序列的方法。

繼承自 Iterable 的類擁有一組通用方法,例如:

  • iterator()

  • forEach()

  • contains()

  • count()

  • drop()

  • filter() 等。

MutableIterable 除了擁有 Iterable 的方法外,還支持迭代時移除元素的方法,例如:

  • remove()

  • removeAll()

值得注意的是,雖然 drop()remove() 都可以“移除”元素,但它們的行為不同:

  • drop() 返回的是一個新的集合對象

  • remove()直接修改原集合對象(前提是集合是可變的)。

還要注意:你只能使用同一個 iterator 對象遍歷一次集合,如果想再遍歷一次,就必須重新創建一個新的 iterator()

當然你也可以使用 for 循環或者 forEach() 來迭代集合。


Collection 接口結構

我們來看看 Kotlin 集合之間的繼承關系:

  • Iterable<T>Collection<T>List<T>Set<T>

  • MutableIterable<T>MutableCollection<T>MutableList<T>MutableSet<T>

其中:

  • Collection<T> 是不可變集合的根接口,支持 sizeget()find()filter()count() 等方法。

  • MutableCollection<T> 是可變集合的根接口,支持 add()remove()drop()addAll() 等方法。

注意:雖然我們通常也將 Map 稱作集合,但它并不繼承CollectionIterable,因為它存儲的是鍵值對而不是單個元素,所以它有自己獨特的方法集合。


使用 Collection 接口舉例

你可以通過三種方式遍歷集合:

fun printAll(strings: Collection<String>) {for (str in strings) print("$str ")
}fun printAll(songs: Collection<String>) {songs.forEach { print("$it ") }
}fun printAll(songs: Collection<String>) {val songsIterator = songs.iterator()while (songsIterator.hasNext()) {print("${songsIterator.next()} ")}
}

示例:

val listOfSongs = listOf("Creep", "Idioteque", "Street Spirit", "Paranoid Android")
printAll(listOfSongs)
// 輸出:Creep Idioteque Street Spirit Paranoid Android

所有集合都有一些通用的方法:

  • count():返回滿足條件的元素數量。

  • drop():返回一個新的列表,其中不包含前 n 個元素。

  • containsAll():檢查集合是否包含另一個集合中的所有元素,并返回 true 或 false。
    常用方法示例:

fun countElements(strings: Collection<String>) = strings.count { it.matches("\\w+".toRegex()) }fun dropElements(songs: Collection<String>) = songs.drop(2).toSet()fun compareCollections(old: Collection<String>, new: Collection<String>) = old.containsAll(new)val setOfSongs = setOf("Creep", "Idioteque", "Street Spirit", "Paranoid Android")
val listOfSongs = listOf("Creep", "Idioteque", "Street Spirit", "Paranoid Android")println(countElements(setOfSongs)) // 輸出:2
println(dropElements(listOfSongs)) // 輸出:[Street Spirit, Paranoid Android]
println(compareCollections(listOfSongs, setOfSongs)) // 輸出:true

更多集合操作方法

  • joinToString()將集合作為帶有特定分隔符的字符串返回。

  • find()返回符合模式的第一個元素。

  • filter()返回List滿足條件的元素。

  • minus()返回不包含條件中指定的元素的集合。

  • random()返回集合中的一個隨機元素。
    一些例子:

fun convertToString(strings: Collection<String>) = strings.joinToString(" | ")fun findElement(strings: Collection<String>) = strings.find { it.contains("I") }fun filterElements(strings: Collection<String>) = strings.filter { it.contains("t") }fun returnRandomElement(strings: Collection<String>) = strings.random()fun decreaseCollection(strings: Collection<String>) = strings.minus("Creep")

示例:

val listOfSongs = listOf("Creep", "Idioteque", "Street Spirit", "Paranoid Android")
val setOfSongs = setOf("Creep", "Idioteque", "Street Spirit", "Paranoid Android")println(convertToString(listOfSongs)) // Creep | Idioteque | Street Spirit | Paranoid Android
println(findElement(setOfSongs))     // Idioteque
println(filterElements(listOfSongs)) // [Idioteque, Street Spirit]
println(returnRandomElement(setOfSongs)) // 可能輸出任意一個元素
println(decreaseCollection(setOfSongs))  // [Idioteque, Street Spirit, Paranoid Android]

注意:drop()minus() 都不會修改原集合,而是返回一個新的集合對象。


MutableCollection 可變集合

MutableCollection 可以使用 Collection 的所有方法,還支持如下修改原集合的方法:

  • addAll():添加一整個集合。

  • add():添加單個元素。

  • clear():清空集合。

  • remove():移除元素的第一個出現位置。

fun addCollection(old: MutableCollection<String>, new: Collection<String>) {old.addAll(new)
}fun addNewElement(old: MutableCollection<String>) {old.add("Spectre")
}fun clearCollection(old: MutableCollection<String>) {old.clear()
}fun removeElement(old: MutableCollection<String>): Boolean {return old.remove("Creep")
}

示例:

val oldSongs = mutableSetOf("Creep", "Street Spirit")
val newSongs = listOf("Creep", "Street Spirit", "Paranoid Android")clearCollection(oldSongs)
println(oldSongs) // []addCollection(oldSongs, newSongs)
println(oldSongs) // [Creep, Street Spirit, Paranoid Android]addNewElement(oldSongs)
println(oldSongs) // [Creep, Street Spirit, Paranoid Android, Spectre]removeElement(oldSongs)
println(oldSongs) // [Street Spirit, Paranoid Android, Spectre]
println(removeElement(oldSongs)) // false,因為沒有 "Creep" 了

retainAll()

retainAll() 方法會讓集合只保留在另一個集合中也存在的元素:

fun retainAllFromCollection(old: MutableCollection<String>, new: Collection<String>) {old.retainAll(new)
}val oldSongs = mutableSetOf("Creep", "Street Spirit", "Paranoid Android")
val newSongs = listOf("Spectre", "Street Spirit")retainAllFromCollection(oldSongs, newSongs)
println(oldSongs) // [Street Spirit]

函數與集合的關系

你可以使用集合的接口類型(如 CollectionList)作為函數的參數,以創建更通用的處理函數。例如:

fun processNumbers(list: List<Number>) {list.forEach { print("$it ") }
}val numbers1 = listOf(0, 12, 10)
val numbers2 = listOf(0.0, 12.0, 10.0)
val numbers3 = listOf(423324534536356, 4L, 56L)processNumbers(numbers1) // 0 12 10
processNumbers(numbers2) // 0.0 12.0 10.0
processNumbers(numbers3) // 423324534536356 4 56

但如果你嘗試在 Number 類型上做加法,會出錯:

fun processNumbers(list: List<Number>) {list.forEach { print(it + 1) } // ? 報錯:未解析的引用
}

因為 Number 是抽象類,不支持加法。你可以先轉換類型:

fun processNumbers(list: List<Number>) {list.forEach { print("${it.toChar()} ") }
}val numbers1 = listOf(41, 42, 43)
processNumbers(numbers1) // ) * +

總結

  • Kotlin 中集合是接口,可以通用于多種集合類型。
  • CollectionMutableCollection 提供了許多通用操作方法。
  • Map 雖然被稱為集合,但并不繼承自 Collection。可以編寫通用函數處理 SetListMutableSetMutableList 等集合類型。
  • drop()minus() 不改變原集合,而 remove()add() 會修改原集合(前提是集合是可變的)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89001.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git 常用操作與注意事項全攻略

1. 基本配置 git config --global user.name "你的名字" git config --global user.email "你的郵箱" git config --list # 查看當前配置建議全局配置用戶名和郵箱&#xff0c;否則提交記錄可能不規范2.倉庫操作 初始化本地倉庫 git init只在新建項目時使…

STM32-第五節-TIM定時器-1(定時器中斷)

一、定時器原理&#xff1a;1.介紹&#xff1a;對指定輸入時鐘進行計數&#xff0c;并在計數值達到設定值時觸發中斷。分類&#xff1a;基本定時器&#xff0c;通用定時器&#xff0c;高級定時器頻率&#xff1a;72MHZ2.框圖&#xff1a; &#xff08;1&#xff09;基本定時器&…

【圖像處理基石】什么是色盲仿真技術?

色盲仿真概述 色盲仿真是一種將正常色彩圖像轉換為色盲患者感知效果的技術。人類常見的色盲類型包括&#xff1a; 紅色盲&#xff08;Protanopia&#xff09;&#xff1a;無法感知紅色綠色盲&#xff08;Deuteranopia&#xff09;&#xff1a;無法感知綠色藍黃色盲&#xff08;…

九、官方人格提示詞匯總(中-3)

“參謀代寫計劃”功能輸出欣賞&#xff0c;規則&#xff1a; 本部分統一使用 Gemini 2.5 Pro API。該 API 下的輸出質量基本達到我的要求&#xff0c;已具備實用價值。嚴格等級均為“權衡有度&#xff08;L3&#xff09;”&#xff0c;創造力等級均為“趨勢捕手&#xff08;L3…

華為MateBook D 16 SE版 2024款 12代酷睿版i5集顯(MCLF-XX,MCLF-16)原廠OEM預裝Win11系統

適用型號&#xff1a;MCLF-XX,MCLF-16鏈接&#xff1a;https://pan.baidu.com/s/1OkvUqZMdCSF98YtQfWAYXw?pwdq2gh 提取碼&#xff1a;q2gh 華為開箱狀態出廠Windows11系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office辦公軟件、華為電腦…

Python自動化:每日銷售數據可視化

這是手動執行sql分組查出的Linda奶茶店每日的銷售數據,那么能否圖形化展示方便對比近一個月每日的銷售趨勢呢。如果是做在網站里,前端可以集成echart或highchart生成柱狀圖或線狀圖。如果需要每天定時推送這些數據到郵箱或其他消息通知渠道,第一步肯定是需要先生成圖片到服務…

scrapy項目開發流程

1.創建項目&#xff1a;scrapy startproject mySpider2.生成一個爬蟲&#xff1a;scrapy genspider itcast itcast.cn3.提取數據&#xff1a;根據網站結構在spider中實現數據采集相關內容4.保存數據使用pipeline進行數據后續處理和保存1.創建項目items.py-->自己預計需要爬取…

堆排序以及其插入刪除

堆排序首先介紹一下堆排序屬于選擇排序的一種類型。其次就是他有點依賴于順序存儲樹判斷其孩子以及父節點的概念&#xff0c;接下來復習一下。堆分為大根堆和小根堆① 若滿?&#xff1a;L(i)≥L(2i)且L(i)≥L(2i1) &#xff08;1 ≤ i ≤n/2 &#xff09;—— ?根堆&#xff…

Spring Boot項目結構解析:構建高效、清晰的代碼框架

在當今的軟件開發領域&#xff0c;Spring Boot因其簡潔性和強大的功能而備受青睞。它不僅簡化了Spring框架的配置&#xff0c;還提供了一套高效的項目開發模式。本文將深入探討Spring Boot項目結構中的關鍵組件&#xff0c;包括PO、Query、VO、Config等&#xff0c;旨在幫助開發…

多客戶端 - 服務器結構-實操

實現2個客戶端之間互相聊天 要求&#xff1a; 1、服務器使用 select 模型實現接受多個客戶端連接&#xff0c;以及轉發消息 2、客戶端要求&#xff1a;使用 poll 模型解決 技能夠 read 讀取服務器發來的消息&#xff0c;又能夠scanf讀取鍵盤輸入的信息 3、客戶端服務器不允許開…

iOS高級開發工程師面試——Objective-C 語言特性

iOS高級開發工程師面試——Objective-C 語言特性 一、多態二、繼承三、代理(Delegate)1. 代理為什么用 weak 修飾呢?block和代理的區別?四、通知(NSNotificationCenter)五、KVC (Key-value Coding)六、屬性七、`@property` [?pr?p?ti]的本質是什么?ivar 、 setter …

MMpretrain 中的 LinearClsHead 結構與優化

LinearClsHead 結構與優化 一、LinearClsHead 核心結構 在 MMPretrain 中&#xff0c;LinearClsHead 是一個簡潔高效的分類頭&#xff0c;其核心結構如下&#xff1a; class LinearClsHead(BaseModule):def __init__(self,num_classes, # 類別數量in_channels, # 輸入…

Spring 學習筆記

1.Spring AOP 怎么實現的AOP 即面向切面編程&#xff0c;是通過代理實現的&#xff0c;主要分為靜態代理和動態代理&#xff0c;靜態代理就是在程序運行前就已經指定并聲明了代理類和增強邏輯&#xff0c;運行時就已經被編譯為字節碼文件了&#xff0c;而動態代理則是在運行過程…

【CVPR2024】計算機視覺|InceptionNeXt:速度與精度齊飛的CNN架構

論文地址&#xff1a;http://arxiv.org/pdf/2303.16900v3 代碼地址&#xff1a;https://github.com/sail-sg/inceptionnext 關注UP CV縫合怪&#xff0c;分享最計算機視覺新即插即用模塊&#xff0c;并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要…

7.15 窗口函數 | 二分 | 位運算 | 字符串dp

lc3316. 字符串dpdp多開一行一列后&#xff0c;注意原字符串下標映射dp[n][m] &#xff08; n 是source長度&#xff0c; m 是pattern長度&#xff09;兩重循環填表for i 1-nfor j 0-m三種狀態轉移1.不選 dp i jdp i-1 j2.不選if tag, dp[i][j]3.if(s ip j) 選&#xff0c;dp i…

Spring原理揭秘--初識AOP

我們知道軟件開發一直在追求高效&#xff0c;易維護&#xff0c;易擴展的特性方式。在面向過程編程到面向對象編程的歷程中&#xff0c;程序的開發有了非常大的進步。但是oop的方式缺依然存在著一些缺點。oop的方式可以將業務進行很好的分解和封裝使其模塊化&#xff0c;但是卻…

Provider模式:軟件架構中的“供應商“設計哲學

文章目錄Provider模式&#xff1a;軟件架構中的“供應商“設計哲學什么是Provider模式&#xff1f;經典應用場景1. 配置管理Provider2. 數據訪問Provider4. 消息隊列ProviderProvider模式的優勢1. 解耦合實際項目中的應用Provider模式的最佳實踐1. 命名約定2. 接口設計原則3. 錯…

LTspic下載,幫助及演示電路

1.下載 LTspice是一款強大高效的免費SPICE仿真器軟件、原理圖采集和波形觀測器&#xff0c;為改善模擬電路的仿真提供增強功能和模型。其原理圖捕獲圖形界面使您能夠探測原理圖并生成仿真結果&#xff0c;這些結果可以通過內置波形查看器進一步觀察分析。 鏈接&#xff1a; …

位置編碼/絕對位置編碼/相對位置編碼/Rope原理+公式詳細推導及代碼實現

文章目錄1. 位置編碼概述1.1 為什么需要位置編碼&#xff1f;2. 絕對位置編碼 (Absolute Position Encoding)2.1 原理2.2 數學公式2.3 代碼實現2.4 代碼與公式的對應關系2.5 特性與優勢2.6 可學習的絕對位置編碼3. 相對位置編碼 (Relative Position Encoding)3.1 原理3.2 數學公…

網絡安全初級第一次作業

一&#xff0c;docker搭建和掛載vpm 1.安裝 Docker apt-get install docker.io docker-compose 2.創建文件 mkdir /etc/docker.service.d vim /etc/docker.service.d/http-proxy.conf 3.改寫文件配置 [Service] Environment"HTTP_PROXYhttp://192.168.10.103:7890…