網(wǎng)站首頁 編程語言 正文
集合的創(chuàng)建和遍歷方式
- 集合只要包含List和Set在寬泛一些就包括Map這種鍵值對類型的數(shù)據(jù)結(jié)構(gòu)
- List,Set和Map在java當(dāng)中都是接口,其中List的主要實現(xiàn)類是ArrayList和LinkedList,Set的主要用的實現(xiàn)類是HashSet,Map主要用的實現(xiàn)類是HashMap
- 現(xiàn)在我們要創(chuàng)建一個水果集合來放水果,在Kotlin當(dāng)中可以這樣寫
val list = ArrayList<String>()
list.add("蘋果")
list.add("香蕉")
list.add("橘子")
這種初始化集合的方式比較繁瑣,在Kotlin當(dāng)中給我們提供了一個listOf方法可以簡化集合的初始化
val list = listOf<String>("蘋果", "香蕉", "橘子")
使用Kotlin當(dāng)中的for-in方法對集合進行遍歷
fun main() {
val list = listOf<String>("蘋果", "香蕉", "橘子")
for (fruit in list) {
println(fruit)
}
}
需要注意的是使用listOf方法初始化的集合是一種不可變的集合,意思就是使用listOf初始化的集合只能用來讀取不能用來添加,修改或者刪除
那么我們要是想要快速初始化一個集合,又想要可變可以使用mutableListOf方法進行初始化
fun main() {
val list = mutableListOf<String>("蘋果", "香蕉", "橘子")
list.add("哈密瓜")
for (fruit in list) {
println(fruit)
}
}
Set集合地用戶幾乎和List一樣,只是將創(chuàng)建集合地方式換成了setOf和mutableSetOf
val set = setOf<String>("香蕉", "橘子", "蘋果")
set集合存放的元素是不可重復(fù)的
Map集合的用法在Kotlin當(dāng)中也比較多,和java比較類似的是下面這一種
val map = HashMap<String, Int>()
map.put("香蕉", 1)
map.put("西瓜", 2)
但是在Kotlin當(dāng)中還有一種類似于數(shù)組下標(biāo)的寫法
val map = HashMap<String, Int>()
map["香蕉"] = 1
map["西瓜"] = 2
而在map中讀取一條寫法
map.get("香蕉")
//或者還可以是這樣(推薦)
map["香蕉"]
當(dāng)然上面這些都不是最簡單的寫法,在Kotlin當(dāng)中給Map也提供了mapOf和mutableMapOf兩個函數(shù)進行快速的初始化
fun main() {
val map = mapOf<String, Int>("香蕉" to 1, "西瓜" to 2)
for ((fruit, number) in map) {
println("fruit is " + fruit + "number is " + number)
}
}
集合的函數(shù)式API
在一個水果集合當(dāng)中,找到單詞最長那個水果
寫法一:
val list = listOf<String>("Apple", "Banana", "Orange", "Pear")
var maxLengthFruit = ""
for (fruit in list) {
if (fruit.length > maxLengthFruit.length) {
maxLengthFruit = fruit
}
}
println("max length fruit is " + maxLengthFruit)
寫法二:(使用函數(shù)式API寫法)
val list = listOf<String>("Apple", "Banana", "Orange", "Pear")
val maxLengthFruit = list.maxBy { it.length }
println("max length fruit is " + maxLengthFruit)
- 上面的代碼不易理解,下面一步步分析Lambda表達式的寫法
- Lambda定義:就是一小段可以作為參數(shù)傳遞的代碼
- Lambda表達式的語法結(jié)構(gòu)體
{參數(shù)名1: 參數(shù)類型, 參數(shù)名2: 參數(shù)類型 -> 函數(shù)體}
- 回到剛才找出最長單詞的水果的需求,其中maxBy就是一個普通的函數(shù)而已,只不過就是接收了一個Lambda類型的參數(shù),并且在遍歷的時候?qū)⒚看伪闅v的值傳遞給Lambda表達式,maxBy函數(shù)就是根據(jù)我們傳入的條件來遍歷集合,從而找到該條件下的最大值
- 理解原理之后這個代碼就可以這樣寫了
val list = listOf<String>("Apple", "Banana", "Orange", "Pear")
//定義一個lambda表達式
val lambda = {fruit: String -> fruit.length}
//然后將這個lambda表達式作為參數(shù)傳遞給maxBy函數(shù),maxBy函數(shù)的作用就是遍歷集合,根據(jù)參數(shù)條件來找到最大值
val maxLengthFruit = list.maxBy(lambda)
- 但是上述寫法比較啰嗦麻煩,可以在此基礎(chǔ)上進行簡化操作
- 首先不需要專門定義一個Lambda變量,而是可以直接將Lambda表達式傳入maxBy函數(shù)中
val maxLengthFruit = list.maxBy({<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length})
- 然后在Kotlin當(dāng)中規(guī)定當(dāng)Lambda表達式是函數(shù)最后一個參數(shù)的時候,可以將Lambda表達式一道函數(shù)括號外面
val maxLengthFruit = list.maxBy(){<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
- 如果當(dāng)lambda參數(shù)是函數(shù)唯一一個參數(shù)的時候,函數(shù)的括號可以省略
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
- 然后在Kotlin當(dāng)中擁有優(yōu)秀的推到機制,Lambda表達式中的參數(shù)列表在大多數(shù)的情況下沒必要聲明參數(shù)的類型,因此可以進一步簡化成為
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit -> fruit.length}
- 最后在Lambda中當(dāng)參數(shù)列表只有一個參數(shù)的時候,也不必要聲明參數(shù)名,而是直接使用it關(guān)鍵字代替即可,那么代碼就變成了
val maxLenght = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->it.length}
- 集合當(dāng)中的map函數(shù)是比較常用的一種函數(shù)式API,它將用于集合中每個元素都映射成為一個另外的值,映射的規(guī)則在Lambda表達式中進行指定
- 將單詞都轉(zhuǎn)換成為大寫字母
val list = listOf<String>("Apple", "Banana")
val newList = list.map { it.toUpperCase() }
for (fruit in newList) {
println(fruit)
}
- map函數(shù)的功能十分的強大,可以按照我們的需求對集合中的元素進行任意的映射轉(zhuǎn)換
- filter函數(shù):是用來過濾集合當(dāng)中數(shù)據(jù)的,可以單獨使用,也可以和map函數(shù)配合在一起進行使用
- 比如我們想保留5個字母以內(nèi)的水果,并且將字母全部轉(zhuǎn)換成為大寫字母
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val newList = list.filter { it.length <= 5 }
.map { it.toUpperCase() }
for (fruit in newList) {
println(fruit)
}
- any函數(shù)和all函數(shù)
- any函數(shù)用于判斷集合中是否至少存在一個元素滿足指定條件,all函數(shù)用于判斷集合中是否所有元素都滿足指定的條件
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val anyResult = list.any {it.length <= 5}
val allResult = list.all { it.length <= 5 }
println("anyResult is" + anyResult + ", allResult is" + allResult)
原文鏈接:https://blog.csdn.net/weixin_45809829/article/details/127984177
相關(guān)推薦
- 2022-05-17 Error running ‘myToncat‘: Address localhost:8080 i
- 2022-09-22 Laravel解決高并發(fā)問題的思路
- 2022-09-24 一文詳解Golang協(xié)程調(diào)度器scheduler_Golang
- 2022-04-08 Unity?UGUI?按鈕綁定事件的?4?種方式匯總_C#教程
- 2022-03-07 Go語言參數(shù)傳遞是傳值還是傳引用_Golang
- 2022-10-04 Linux行處理工具之grep?正則表達式詳解_正則表達式
- 2023-04-18 利用Python操作MongoDB數(shù)據(jù)庫的詳細指南_python
- 2022-01-18 解決CSRF verification failed. Request aborted.的問題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支