【Kotlin/Android】MutableListとは?Listとの違いやfilter/containsなど

この記事からわかること
- Android/KotlinのListとは?
- コレクション型の種類
- MutableListやArrayListとの違い
- 要素を追加、削除する方法
- フィルターやソート、mapの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Android/KotlinのListとは?
KotlinのList
はデータを複数保持できるコレクション型の1つとして定義されたデータ型です。似たようなデータ型に配列(Array)がありますが、配列はプリミティブ型(基本的な型)として定義されたデータ型です。
Listは要素を複数保持できたり、要素が順序付けされて管理されていることでインデックスでアクセスできたりと基本的には配列と同じような機能を持っています。
Listの継承関係と種類
Listの中にも種類が分かれており、シンプルなList
やMutableList
、ArrayList
などに分かれています。定義をみてみると以下のような継承関係になっていました。
List
List
は不変(Immutable)なコレクションとして定義されており、要素の変更や追加ができません。生成するにはlistOf
やlistOfNotNull
メソッドを使用します。
listOf
メソッドは引数に与えられた要素を元にListを生成するメソッドです。変数側に明示的に型を指定した場合はnull
を格納することはできませんが、型を指定しなかった場合はnull
を許容します。
listOfNotNull
メソッドも引数に与えられた要素を元にListを生成するメソッドですlistOf
と違うのはnull
を許容しないことです。
- 不変(Immutable)
- 読み取り専用のコレクション
MutableList
MutableList
は可変な(Mutable)コレクションとして定義されており、要素の変更や追加が可能になっています。そのため要素を追加するためのadd
メソッドや削除するためのremoveAt
メソッドが用意されています。
- 可変(Mutable)
- 読み取り/書き込み可能なコレクション
ArrayList
ArrayList
もMutableList
同様に可変な(Mutable)コレクションとして定義されており、要素の変更や追加が可能になっています。そのため先ほどのコードをArrayListに置き換えても正常に動作します。
MutableListとの違い
MutableList
とArrayList
は一見全く同じに見えますが、そもそも定義が異なります。MutableList
はinterface
で定義されており抽象的なクラスです。一方ArrayList
はclass
なので具体的な実装になります。
またArrayList
JavaのArrayList
と対応しており、KotlinからJavaのコードを呼び出す際に違和感なく利用できるようになっています。
- 可変(Mutable)
- 読み取り/書き込み可能なコレクション
- 具体的な実装(クラス)
- Javaとの互換性
コレクションの操作
ここまで紹介したコレクション型を操作する方法をまとめていきます。今回は代表してList型で実装してみます。
要素数を取得する:size
コレクションの要素数はsize
プロパティから取得できます。
中身が空か確認する:isEmpty
中身が空か確認するにはisEmpty
メソッドを使用します。空であればtrue
を返します。またisNotEmpty
メソッドはその逆です。
含まれているか確認する:contains
コレクションの中に要素が含まれているか確認するにはcontains(element: T)
メソッドを使用します。引数に対象の要素を渡します。
特定の条件に一致するものが含まれているか確認する:any
contains
ではコレクション内の要素と一致するものがあるかないかしか確認できませんでしたが、独自のデータ型のプロパティが一致しているかのような、特定の条件に一致するものが含まれているかを確認したい場合はany
メソッドを使用します。
インデックスを取得する:indexOf
コレクション内の要素のインデックスを取得するにはcontains(element: T)
メソッドを使用します。引数に対象の要素を渡します。
コレクションの一部を切り出す:subList
コレクションの一部を切り出すにはsubList(fromIndex: Int, toIndex: Int)
メソッドを使用します。引数に切り出したいインデックス番号渡します。
コレクション内の要素に同じ処理を繰り返す:forEach
コレクション内の要素に同じ処理を繰り返すにはforEach(action: (T) -> Unit)
メソッドを使用します。it
で要素1つ1つを参照できます。
要素に処理を施したコレクションを取得する:map
要素に処理を施したコレクションを取得するにはmap(transform: (T) -> R)
メソッドを使用します。例えば以下は要素1つ1つに大文字に変換する処理を施したコレクションを取得する方法です。
また関数リファレンスを使用して以下のように記述することも可能です。
条件で絞り込む:filter
要素を条件で絞り込むにはfilter(predicate: (T) -> Boolean)
メソッドを使用します。例えば以下は偶数のみ抽出する方法です。
要素を並び替える:sorted
要素を並び替えるにはsorted
メソッドを使用します。
またsortedBy(selector: (T) -> R)
メソッドを使用することでソート対象を指定することが可能です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。