Kotlin基礎知識(十二)——基本數據類型和其餘數據類型

1、可空性和集合

  • 建立一個包含可空值的集合
fun readNumbers(reader: BufferedReader): List<Int?> {
    // 建立包含可空Int值的列表
    val result = ArrayList<Int?>()
    for (line in reader.linesSequence()) {
        try {
            // 向列表添加整數(非空值)
            val number = line.toInt()
            result.add(number)
        }
        catch(e: NumberFormatException) {
            // 向列表添加null,由於當前行不能被解析爲整數
            result.add(null)
        }
    }
    return result
}
複製代碼

List<Int?>是能持有Int?類型值的列表:換句話說,能夠持有Int或者null數組

注意:變量本身類型的可空性和用做類型參數的類型的可空性是有區別的。包括可空Int的列表和包含Int的可空列表之間的區別如圖1:安全

圖1 集合的元素和集合自己可空性

在第一種狀況下,列表自己始終不爲null,但列表中的每一個值均可覺得null。第二種類型的變量可能包含空引用而不是列表實例,但列表中的元素保證是非空的markdown

Kotlin提供了一個標準庫函數***filterNotNull***:遍歷一個包含可空值的集合並過濾掉null。多線程

2、只讀集合與可變集合

Kotlin的集合設計和Java不一樣的另外一項重要特質是,它把訪問集合數據的接口和修改集合數據的接口分開了。這種區別存在於最基礎的使用集合的接口之中:kotlin.collections.Collection。使用這個接口,能夠遍歷集合中的元素、獲取集合大小、判斷集合中包含某個元素,以及執行其餘從該集合中讀取數據的操做。但這個接口沒有任何添加或移除元素的方法。函數

使用***kotlin.collections.MutableCollection接口能夠修改集合中的數據。它繼承了普通的kotlin.collections.Collection*接口,還提供了方法來添加和移除元素、清空元素**等。測試

  • 只讀集合:函數接受***Collection而不是MutableCollection做爲形參,只能讀取數據*。
  • 可變集合:函數要求接受***MutableCollection形參,則是能夠修改數據*。
// 定義
fun <T> copyElements(source: Collection<T>, target: MutableCollection<T>) {
    // 在source集合中的全部元素中循環
    for(item in source) {
        target.add(item)
    }
}

// 測試
>>> val source: Collection<Int> = arrayListOf(3, 5, 7)
>>> val target: MutableCollection<Int> = arrayListOf(1)
>>> copyElements(source, target)
>>> println(target)
[1, 3, 5, 7]
複製代碼

注意:只讀集合不必定是不可變的。由於它可能只是同一個集合的衆多引用中的一個。任何其餘的引用均可能擁有一個可變接口類型。ui

只讀集合老是線程安全的。若是你在多線程環境下處理數據,須要保證代碼正確地同步了對數據的訪問。spa


集合建立函數線程

集合類型 只讀 可變
List listOf mutableListOf、arrayListOf
Set SetOf mutableSetOf、hashSetOf、LinkedSetOf、sortedSetOf
Map mapOf mutableMapOf、hashMapOf、LinkedMapOf、sortedMapOf

4、對象和基本數據類型的數組

要在Kotlin中建立數組,有下面這些方法供你選擇:設計

  • **arrayOf函數建立一個數組,它包含的元素是指定爲該函數的實參
  • arrayOfNulls建立一個給定大小的數組,包含的是null元素。固然,它只能用來建立包含元素類型可空的數組**。
  • *Array*構造方法接受數組的大小和一個lambda表達式,調用lambda表達式來建立每個數組元素。這就是使用非空元素類型初始化數組,但不能顯示地傳遞每一個元素的方式。

爲了表示基本數據類型的數組,Kotlin提供了若干獨立的類,每一種基本數據類型都對應一個。如,Int類型值的數組叫作IntArray。Kotlin還提供了***ByteArray、CharArray、BooleanArray等給其餘類型。全部這些類型都被編譯成普通的Java基本數據類型數組,好比int[]、byte[]、char[]***等


要建立一個基本數據類型的數組,你有以下選擇

  • 該類型的構造方法接受***size參數並返回一個使用對應基本數據類型默認值*(一般是0)初始化號的數組
  • 廠函數(IntArray的intArrayOf,以及其餘數據類型的函數)接受變長參數的值並建立存儲這些值的數組
  • 另外一種構造方法,接受一個大小和一個用於初始化每一個元素的lambda
val fiveZeros = IntArray(5)
val fiveZwrosToo = intArrayOf(0, 0, 0, 0, 0)

>>> val squares = IntArray(5) { i -> (i + 1) * (i + 1) }
>>> println(squares.joinToString())
1, 4, 9, 16, 25
複製代碼
相關文章
相關標籤/搜索