kotlin學習筆記-異常好玩的list集合總結

codeGoogle發表於2018-07-16
不積跬步無以至千里,不積小流無以成江海

先看看Kotlin中for迴圈的遍歷

 fun  testList(){
        var StringVal = "12_12_13_15_a_b_c_d_yu_er"
        var ssArray = StringVal.split("_")
        var ss01 = ssArray[0]
        var ss02 = ssArray[1]
        var size =  ssArray.size
        println("ss01:   $ss01")
        println("ss02:   $ss02")
        println("size:$size")
        val items = listOf("apple", "banana", "kiwi")
        //迭代for迴圈
        for (item in ssArray){
            println("item:  $item")
        }

        for (item in ssArray)  println("item:  $item")


        //迴圈體可以是一個程式碼塊:
        for (item : String in ssArray ){
            println("item:  $item")
        }

        //通過索引進行遍歷,for 可以迴圈遍歷任何提供了迭代器的物件。
        //如果你想要通過索引遍歷一個陣列或者一個 list
        //注意這種"在區間上遍歷"會編譯成優化的實現而不會建立額外物件。
        for (i in ssArray.indices) {
            print(ssArray[i])
        }


        //這種"在區間上遍歷"會編譯成優化的實現而不會建立額外物件。或者你可以用庫函式 withIndex:
        fun forbetween(index :Int,value : Objects){
            for ((index,value) in ssArray.withIndex()){
                println("the element at $index is $value")
            }
        }
    }
複製程式碼

kotlin和Java中的集合工具類

Java中集合及其工具類 Kotlin中Java中集合及其工具類
List MutableList
Set MutableSet
Map MutableMap
Collection MutableCollection
List MutableList
Set MutableSet
Map MutableMap
Collection MutableCollection
Iterable MutableIterable
,Kotlin針對集合進行了更加簡潔和有效的封裝
  • Iterable:父類。所有我們可以遍歷一系列的都是實現這個介面。

  • MutableIterable:一個支援遍歷的同時可以執行刪除的Iterables。

  • Collection:這個類相是一個範性集合。我們通過函式訪問可以返回集合的size、是否為空、是否包含一個或者一些item。這個集合的所有方法提供查詢,因為connections是不可修改的。

  • MutableCollection:一個支援增加和刪除item的Collection。它提供了額外的函式,比如add 、remove、clear等等。

  • List:可能是最流行的集合型別。它是一個範性有序的集合。因為它的有序,我們可以使用get函式通過position來訪問。

  • MutableList:一個支援增加和刪除item的List。

  • Set:一個無序並不支援重複item的集合。

  • MutableSet:一個支援增加和刪除item的Set。

  • Map:一個key-value對的collection。key在map中是唯一的,也就是說不能有兩對key是一樣的鍵值對存在於一個map中。

  • MutableMap:一個支援增加和刪除item的map。

比如: List是以線性方式管理物件集合,其可以很快的在任何地方進行增加和刪除元素。List介面繼承Collection介面,集合中可以存放重複物件。

對於介面的實現

Kotlin中可以這樣寫:

而在Java 中卻不能這樣寫

kotlin學習筆記-異常好玩的list集合總結

集合的建立

        
        val list1 = listOf<Int>()           //返回的是kotlin的List,只讀
        val list2 = mutableListOf<Int>()    //返回的是kotlin的MutableList,可讀寫
        val list3 = arrayListOf<Int>()      //返回的是java的ArrayList,java的ArrayList是可讀寫的


        var setList = setOf<Int>()         //返回的是kotlin的set集合,一個無序並不支援重複item的集合 只讀
        var setMutableList   = mutableSetOf<Int>() //返回的是kotlin的set集合 MutableSet  可讀寫
        var hashSet = hashSetOf<Int>()   //返回的是java的set集合 hashSet  可讀寫

        var map = mapOf<String, Int>() //返回kotlin中的map,只讀
        mutableMapOf<String, Int>() // 返回的是kotlin中的hashmap集合,可讀可寫
        hashMapOf<String, Int>() //返回java中的hashmap 可讀可寫

        //eg:怎麼取用
        list2.add(1)
        var first : Int = list2.first()
        list3.add(1)
        var first2 : Int = list3.first()
複製程式碼

集合set:

一些常用的用法

set集合中的元素是不會有重複的,並且是亂序的。建立set需要使用setOf(),mutableSetOf():

val set= setOf<String>(
        "祖安",
        "皮爾特沃夫"
)
val mutableSet= mutableSetOf<String>(
        "阿利斯塔",
        "希維爾"
)
複製程式碼

Map: Map是一個存放鍵和值的集合,每一個元素都包含鍵和值。Kotlin中Map和list一樣,也分為只讀和可變兩種Map。

建立Map時需要呼叫mapOf(),mutableMapOf():

val map= mapOf<Int,String>(
        1 to "伊澤瑞爾", 2 to "雷克頓", 3 to "古拉加斯", 4 to "泰達米爾"
)
val hashMap= hashMapOf<Int,String>(
        1 to "伊澤瑞爾", 2 to "雷克頓", 3 to "古拉加斯", 4 to "泰達米爾"
)
複製程式碼

map和hashMap的區別,這裡就不說了,Java的基礎

val count=map.size  //獲取元素數量
val keys=map.keys   //返回map中key的集合
keys.forEach(::print)   //輸出Log:1,2,3,4
val values=map.values    //返回map中key的集合
values.forEach(::print)     //輸出Log:伊澤瑞爾,雷克頓,古拉加斯,泰達米爾
val entry=map.entries   //返回鍵/值對集合
entry.forEach{
    println("key: ${it.key} , value: ${it.value}")
}       //輸出key:1 , value:伊澤瑞爾  key:2...

val isEmpty=map.isEmpty()   //判斷集合是否為空 Boolean
val isContainsKey=map.containsKey(3)    //判斷集合中是否包含某個key
val isContainsValue=map.containsValue("雷克頓")    //判斷集合中是否包含某個value
val valueStr=map.get(2) //獲取指定key的元素值,沒有則返回null
複製程式碼

上面說了map和list一樣是隻讀的,可變的map需要使用mutableMap:

var mutableMapOf= mutableMapOf<Int,String>()
mutableMapOf.putAll(map)    //新增整個map
mutableMapOf.put(5,"拉克絲")   //新增指定key的value
mutableMapOf.remove(2)  //移除元素
mutableMapOf.clear()    //清空集合
複製程式碼

很多情況下,函式和方法的名字和list的都是一樣的。

集合操作符

val list = listOf(1, 2, 3, 4, 5, 6)

list.any {//只要集合中的任何一個元素滿足條件(使得lambda表示式返回true),any函式就返回true
    it >= 0
}
list.all {//集合中的全部元素都滿足條件(使得lambda表示式返回true),all函式才返回true
    it >= 0
}
list.none {//若集合中沒有元素滿足條件(使lambda表示式返回true),則none函式返回true
    it < 0
}
list.count {//count函式的返回值為:集合中滿足條件的元素的總數
    it >= 0
}
複製程式碼

累計

//對所有元素求和
kotlinList.sum()

//將集合中的每一個元素代入lambda表示式,然後對lambda表示式的返回值求和
kotlinList.sumBy {
    it % 2
}

//在一個初始值的基礎上,從第一項到最後一項通過一個函式累計所有的元素
//accumulator的初始值為100,element從集合的第一個元素開始,lambda表示式的返回值就是accumulator的新值
kotlinList.fold(100) { accumulator, element ->
    accumulator + element / 2
}

//同fold,只是迭代的方向相反
kotlinList.foldRight(100) { accumulator, element ->
    accumulator + element / 2
}

//同fold,只是accumulator的初始值就是集合的第一個元素,element從第二個元素開始
kotlinList.reduce { accumulator, element ->
    accumulator + element / 2
}

//同reduce但方向相反:accumulator的初始值就是集合的最後一個元素,element從倒數第二個元素開始往前迭代
kotlinList.reduceRight { accumulator, element ->
    accumulator + element / 2
}
複製程式碼

遍歷

//遍歷所有元素
kotlinList.forEach {
    print(it)
}

//同forEach,只是可以同時拿到元素的索引
kotlinList.forEachIndexed { index, value ->
    println("position $index contains a $value")
}
複製程式碼

最大最小

//返回集合中最大的元素,集合為空(empty)則返回null
kotlinList.max()

//返回集合中使得lambda表示式返回值最大的元素,集合為空(empty)則返回null
kotlinList.maxBy { it }

//返回集合中最小的元素,集合為空(empty)則返回null
kotlinList.min()

//返回集合中使得lambda表示式返回值最小的元素,集合為空(empty)則返回null
kotlinList.minBy { it }
複製程式碼

過濾

//返回一個新List,去除集合的前n個元素
kotlinList.drop(2)
//返回一個新List,去除集合的後n個元素
kotlinList.dropLast(2)
//返回一個新List,去除集合中滿足條件(lambda返回true)的第一個元素
list.dropWhile {
    it > 3
}
//返回一個新List,去除集合中滿足條件(lambda返回true)的最後一個元素
kotlinList.dropLastWhile {
    it > 3
}
複製程式碼

排序&逆序

val list = listOf(1, 2, 3, 4, 5, 6)
list.reversed() //返回一個顛倒元素順序的新集合
list.sorted() //返回一個升序排序後的新集合
list.sortedBy {//將每個元素代入lambda表示式,根據lambda表示式返回值的大小來對集合進行排序
    it*2
}

list.sortedDescending()//返回一個降序排序後的新集合
list.sortedByDescending {
    it*2
}
複製程式碼

合併&分解

val list = listOf(1, 2, 3, 4, 5, 6)
val list2 = listOf(5, 6, 7, 8, 9, 0)

//拼接兩個集合,返回一個新集合
//本質是呼叫list.plus(list2)
list + list2

//把一個給定的集合分割成兩個list,一個list中是代入lambda表示式後返回true的元素,另一個list中是代入後返回false的元素
val (list3, list4) = list.partition {
    it % 2 == 0
}

//返回一個由pair組成的list,每一個pair由兩個集合中相同index的元素組成
val pairList: List<Pair<Int, Int>> = list.zip(list2)

//unzip與zip的功能相反,將一個由pair組成的list分解成兩個list
val (list5, list6) = pairList.unzip()
複製程式碼

Kotlin集合轉換為陣列

當我們宣告一個集合,可以把這個集合根據呼叫集合類相應的高階函式來轉換成相應的陣列。集合類提供了toIntArray()、toDoubleArray()、toFloatArray()、toBetArray(),toTypedArray等高階函式去處理。

Kotlin集合轉換為陣列

Kotlin陣列轉換為集合

Kotlin中,集合可分為不可變集合與可變集合。我們宣告一個集合或者陣列,可以轉換成相應型別的集合。呼叫toXXX()轉換成不可變集合。呼叫toMutableXXX()轉換為可變集合。集合類提供了toList()、toMutableList()、toSet()、toMutableSet()、toHashSet()、toMap()等高階函式去處理

例如:

Kotlin陣列轉換為集合

嗯,今天就提到這裡,學習Kotlin還有很長的一段路走,一門新的語言需要一顆耐心,摒棄雜念,向前出發吧

推薦幾個學習的地址:

官網文件:

http://kotlinlang.org/

runoob中文文件

http://www.runoob.com/kotlin/kotlin-loop-control.html

閱讀更多

Kotlin開發之旅《一》— 初學者Kotlin基礎必備

我的Android重構之旅:外掛化篇

20+個很棒的Android開源專案

Kotlin已成為Android開發一級語言——這次你絕對不能錯過

相信自己,沒有做不到的,只有想不到的

在這裡獲得的不僅僅是技術!

image

相關文章