1. 程式人生 > >Kotlin 筆記:集合和陣列

Kotlin 筆記:集合和陣列

集合的可空性

集合的可空性包括兩個方面,集合本身的可空性和集合元素的可空性。

List<Int>? :List 本身可空,List 的元素不可空
List<Int?> :List 本身不可空,List 的元素可空
List<Int?>? :List 本身可空,List 的元素也可空

有一個實用方法 filterNotNull,可以遍歷一個包含可空值的集合並過濾掉其中的空值:

fun addValidNumbers(numbers: List<Int?>) {
    val validNumbers = numbers.filterNotNull
() // 此時 validNumbers 就是 List<Int> 型別的了 }

只讀集合與可變集合

Kotlin 把 Java 集合中訪問資料和修改資料的介面分開了。

MutableCollection 繼承了 Collection 並增加了修改集合內容的方法。

Kotlin 喜歡把可變和不可變分清楚,就像 val 和 var 之間的分離一樣,只讀集合介面和可變集合介面的分離讓程式中資料發生的事情更容易理解。

這裡需要牢記的一個關鍵點是,只讀集合不一定是不可變的

如上圖所示,可能只讀集合的引用和可變集合的引用,都指向同一個集合物件,這時該集合的可變性就不能保證了。

Kotlin 集合與 Java

每一種 Java 集合在 Kotlin 中都有兩種表示:一種是隻讀的,一種是可變你的。

同樣的,Map 也被分為了 Map 和 MutableMap。

集合建立函式:

集合型別 只讀 可變
List listOf mutableListOf、arrayListOf
Set setOf mutableSetOf、hashSetOf、linkedSetOf、sortedSetOf
Map mapOf mutableMapOf、hashMapOf、linkedMapOf、sortedMapOf

在 java 中使用 Kotlin 集合

在 java 中使用 Kotlin 集合時,如一個 java 方法接收一個集合引數,這時使用 kotlin 中的可變集合和不可變集合作為實參都是可以的,因為 java 並不知道它是可變的還是不可變的。

所以,當你向可以修改集合的 Java 程式碼傳遞集合時,你需要採用特別的預防措施,來確保 Kotlin 型別正確地反映出集合上所有可能的修改。

在 Kotlin 中使用 Java 集合

與基本資料型別一樣,在 Kotlin 中,Java 的集合型別的變數,會被視為平臺型別,即一個自身可空性未知、元素可空性未知、可變性未知的集合。

當需要重寫 Java 中的方法或是實現一個介面時,需要自己判斷,決定使用哪一種 Kotlin 型別來表示 Java 方法中的集合型別。

這需要根據需求,具體情況,具體分析。

物件和基本資料型別的陣列

預設情況下,應該優先使用集合,但當然,陣列也有它的用處。

要在 Kotlin 中建立陣列,可以使用以下方法:

val a = arrayOf(1, 2, 3)        // [1, 2, 3]
val b = arrayOfNulls<Int?>(3)   // [null, null, null]
val c = Array(3) { it * 2 }     // [0, 2, 4]

通過這樣的方法生成的 Array<Int>,相當於 Java 中的 Integer[]。如果需要 int[] 這樣的基本資料型別陣列,需要使用 Kotlin 中的 IntArray 類進行建立,ByteArray、CharArray、BooleanArray 與之類似。

val a = IntArray(3)         // [0, 0, 0]
val b = intArrayOf(1, 2, 3) // [1, 2, 3]
val c = IntArray(3) { it * 2 }    // [0, 2, 4]

能對集合的操作基本也都適用於陣列(filter、map 等)。

陣列轉化為集合:toList
集合轉化為陣列:toIntArray

相關推薦

Kotlin 筆記集合陣列

集合的可空性 集合的可空性包括兩個方面,集合本身的可空性和集合元素的可空性。 List<Int>? :List 本身可空,List 的元素不可空 List<Int?> :List 本身不可空,List 的元素可空 List<Int?

Java學習筆記34集合陣列區別

集合: 儲存任意物件,長度可變 陣列: 定義長度固定,無法自動增長 區別: 1.長度 2.陣列既可以儲存基本資料型別也可以儲存引用資料型別 集合只能儲存物件,即使儲存基本資料型別進入後也會封箱變成物件 集合 collection介面 LIst:有序(存取順序一致) 有索引,不可以

Java技巧集合陣列的轉換

由於Java平臺API的很大一部分都是在集合框架建立之前設計的,因此有時候需要在傳統的陣列和現代的集合之間進行轉換。 如果你有一個數組,就需要將它轉化為一個集合,Array.asList包裝器能夠實現這個目的,例如: String[] values = ...; HashSe

筆記理解PHP陣列的序列化反序列化

 當我們想要將陣列值儲存到資料庫時,就可以對陣列進行序列化操作,然後將序列化後的值儲存到資料庫中。其實PHP序列化陣列就是將複雜的陣列資料型別轉換為字串,方便陣列存庫操作。對PHP陣列進行序列化和反序列化操作,主要就用到兩個函式,serialize和unserialize。

Java筆記集合框架

system @override emp 底層 log 關聯 del java筆記 集合框架 一、接口 Collection:構建集合框架的基礎,定義集合的所有類都必須實現該接口。 List:線性表,Collection接口擴展。 Set:集,Collection接口擴展

JavaWeb學習筆記ServletConfig()ServletContext()

通過 metadata ips rac oid enume 節點 接口 init ServletConfig()和ServletContext() 1.Serv

linux學習筆記nano cat

lazy print ID scrip light OS 文件的 UC 執行 學習內容來自莫煩python:linux教程 nano nano 是 linux 的一款文字編輯工具. 我們可以拿它來做最基本的 terminal 端的文本編輯, 甚至可以寫代碼~ 下面我們用

effectiveJava學習筆記介面(一)

一、使類和成員的可訪問性最小化 對於類 對於類,只有public和package-private兩種訪問級別。package-private是預設的,也就是預設的。 1.對於頂層的類來說,只有包級私有和公有兩種可能,區別是包級私有意味著只能在當前包中使用,不會成為匯出api的一部分,而公

OpenGL學習筆記GLAD第一個視窗

環境 系統:Windows10 64位 家庭中文版 IDE:Visual Studio 2017 專業版 參考教程:https://learnopengl-cn.github.io/01 Getting started/03 Hello Window/ 步驟 1.獲取GLAD

java學習筆記二維陣列與面向物件

目標: 二維陣列 面向物件程式設計 一、二維陣列 二維陣列就是一個元素為一維陣列的陣列。 格式1: 資料型別[][] 變數名 = new 資料型別[m][n]; m表示這個二維陣列有多少個一維陣列 n表示每一個數組的元素的元素個數 /*

java學習筆記方法與陣列

方法: 方法的定義與使用: java中方法就是函式,將實現某些功能的程式碼封裝到方法中。 /* 概念:就是完成某個功能的程式碼,函式就是方法 格式: 修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2....){ 方法體語句: return 返回值:

集合陣列的區別

A:長度區別             陣列長度固定             集合長度可變B:內容區別  &nb

GO語言學習切片陣列

1.陣列、切片   陣列的長度是固定的,切片的長度是可變長的     陣列的長度在宣告時就必須給定,並且之後不會再變化,陣列的長度是其型別的一部分,比如[1]string和[2]string 不是相同的陣列型別.     切片可以看作是對陣列的封裝,每一個切片的底層的資料結構一定

JNI學習筆記二維陣列的使用

1 前言 2 程式一:Java類中的二維陣列成員傳值給C++並求和 2.1 程式碼 2.2 總結 3 程式二:C++程式碼修改Java類中的二維陣列 3.1 程式碼 3.2 總結 4 程式三:C++程式碼中返回一個二維陣列給

Java筆記物件

Java類和物件 類是在程式設計中經過編寫的,擁有成員變數和一些方法的一種資料型別,可以由自己通過聯絡現實中的事物進行編寫,關鍵字是class,一個Java原始檔只能含有一個public類,且該類名稱與檔名相同。類是對現實中具體事物的一種表示,並且需藉由類建立

你的月亮我的C(六)指標陣列的那些事

先來看幾個問題,一邊從問題中入手,一邊看看指標和陣列之間的那些事: 1、char arr[ ]和char *arr是等價的嗎? 答:不是。看下指標和陣列的定義:陣列是一個用同一型別的多個連續元素組成的事先分配好的記憶體塊。指標是一個可以對任何資料元素的引用。所以陣列的定義

玩轉資料結構——第六章集合對映

集合(Set) 什麼是集合? 集合是承載元素的容器; 特點:每個元素只能存在一次 優點:去重 二分搜尋樹的新增操作add:不能盛放重複元素 是非常好的實現“集合”的底層資料結構 /** * 集合的介面 */ public interface Set<

leetcode筆記_集合對映的使用及比較 (集合的元素去重,對映的元素頻次記錄)

349. 兩個陣列的交集 給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2] 示例 2: 輸

android小知識ArrayList陣列之間的轉換

List----->陣列開發中不免碰到List與陣列型別之間的相互轉換,舉一個簡單的例子: package test.test1; import java.util.ArrayList; import java.util.List; public class Test { /** * @param ar

《JavaScript高階程式設計》筆記DOM2DOM3(十二)

DOM1級主要定義的是HTML和XML文件的底層結構。DOM2級和DOM3級在這個結構基礎上引入了更多的互動能力,也支援更高階的XML特性。為此DOM2級和DOM3級分為了很多的模組(模組直接具有某種關聯),分別描述了DOM的某個非常具體的子集。這些模組如下: DOM2級核心:在1級核心基礎上構建,為