【Kotlin/Android】MutableListとは?Listとの違いやfilter/containsなど
この記事からわかること
- Android/KotlinのListとは?
- コレクション型の種類
- MutableListやArrayListとの違い
- 要素を追加、削除する方法
- フィルターやソート、mapの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Android/KotlinのListとは?
KotlinのList
はデータを複数保持できるコレクション型の1つとして定義されたデータ型です。似たようなデータ型に配列(Array)がありますが、配列はプリミティブ型(基本的な型)として定義されたデータ型です。
Listは要素を複数保持できたり、要素が順序付けされて管理されていることでインデックスでアクセスできたりと基本的には配列と同じような機能を持っています。
Listの継承関係と種類
Listの中にも種類が分かれており、シンプルなList
やMutableList
、ArrayList
などに分かれています。定義をみてみると以下のような継承関係になっていました。
interface Collection<out E> : Iterable<E>
└ interface List<out E> : Collection<E>
└ interface MutableList<E> : List<E>, MutableCollection<E>
└ class ArrayList<E> : MutableList<E>, RandomAccess
List
List
は不変(Immutable)なコレクションとして定義されており、要素の変更や追加ができません。生成するにはlistOf
やlistOfNotNull
メソッドを使用します。
listOf
メソッドは引数に与えられた要素を元にListを生成するメソッドです。変数側に明示的に型を指定した場合はnull
を格納することはできませんが、型を指定しなかった場合はnull
を許容します。
val list: List<String> = listOf("kotlin", "swift", "dart")
val list2 = listOf("kotlin", "swift", null, "dart")
print(list) // [kotlin, swift, dart]
print(list2) // [kotlin, swift, null, dart]
listOfNotNull
メソッドも引数に与えられた要素を元にListを生成するメソッドですlistOf
と違うのはnull
を許容しないことです。
val list = listOfNotNull("kotlin", null, "swift", "dart")
print(list) // [kotlin, swift, dart]
- 不変(Immutable)
- 読み取り専用のコレクション
MutableList
MutableList
は可変な(Mutable)コレクションとして定義されており、要素の変更や追加が可能になっています。そのため要素を追加するためのadd
メソッドや削除するためのremoveAt
メソッドが用意されています。
val mutableList: MutableList<String> = mutableListOf("kotlin", "swift", "dart")
mutableList.add("php")
mutableList[0] = "Java"
mutableList.removeAt(3)
print(mutableList) // [Java, swift, dart]
- 可変(Mutable)
- 読み取り/書き込み可能なコレクション
ArrayList
ArrayList
もMutableList
同様に可変な(Mutable)コレクションとして定義されており、要素の変更や追加が可能になっています。そのため先ほどのコードをArrayListに置き換えても正常に動作します。
val arrayList: ArrayList<String> = arrayListOf("kotlin", "swift", "dart")
arrayList.add("php")
arrayList[0] = "Java"
arrayList.removeAt(3)
print(arrayList) // [Java, swift, dart]"
MutableListとの違い
MutableList
とArrayList
は一見全く同じに見えますが、そもそも定義が異なります。MutableList
はinterface
で定義されており抽象的なクラスです。一方ArrayList
はclass
なので具体的な実装になります。
interface MutableList<E> : List<E>, MutableCollection<E>
class ArrayList<E> : MutableList<E>, RandomAccess
またArrayList
JavaのArrayList
と対応しており、KotlinからJavaのコードを呼び出す際に違和感なく利用できるようになっています。
- 可変(Mutable)
- 読み取り/書き込み可能なコレクション
- 具体的な実装(クラス)
- Javaとの互換性
コレクションの操作
ここまで紹介したコレクション型を操作する方法をまとめていきます。今回は代表してList型で実装してみます。
要素数を取得する:size
コレクションの要素数はsize
プロパティから取得できます。
val list: List<String> = listOf("kotlin", "swift", "dart")
print(list.size) // 3
中身が空か確認する:isEmpty
中身が空か確認するにはisEmpty
メソッドを使用します。空であればtrue
を返します。またisNotEmpty
メソッドはその逆です。
val list: List<String> = listOf("kotlin", "swift", "dart")
print(list.isEmpty()) // false
print(list.isNotEmpty()) // true
含まれているか確認する:contains
コレクションの中に要素が含まれているか確認するにはcontains(element: T)
メソッドを使用します。引数に対象の要素を渡します。
val list: List<String> = listOf("kotlin", "swift", "dart")
print(list.contains("kotlin")) // true
インデックスを取得する:indexOf
コレクション内の要素のインデックスを取得するにはcontains(element: T)
メソッドを使用します。引数に対象の要素を渡します。
val list: List<String> = listOf("kotlin", "swift", "dart")
print(list.indexOf("kotlin")) // 0
コレクションの一部を切り出す:subList
コレクションの一部を切り出すにはsubList(fromIndex: Int, toIndex: Int)
メソッドを使用します。引数に切り出したいインデックス番号渡します。
val list: List<String> = listOf("kotlin", "swift", "dart")
print(list.subList(0,2)) // [kotlin, swift]
コレクション内の要素に同じ処理を繰り返す:forEach
コレクション内の要素に同じ処理を繰り返すにはforEach(action: (T) -> Unit)
メソッドを使用します。it
で要素1つ1つを参照できます。
val list: List<String> = listOf("kotlin", "swift", "dart")
list.forEach {
print(it) // kotlinswiftdart
}
要素に処理を施したコレクションを取得する:map
要素に処理を施したコレクションを取得するにはmap(transform: (T) -> R)
メソッドを使用します。例えば以下は要素1つ1つに大文字に変換する処理を施したコレクションを取得する方法です。
val list: List<String> = listOf("kotlin", "swift", "dart")
val toUpperCase: (String) -> String = { it.toUpperCase() }
val upperCaseList: List<String> = list.map(toUpperCase)
print(upperCaseList) // 出力: [KOTLIN, SWIFT, DART]
また関数リファレンスを使用して以下のように記述することも可能です。
val list: List<String> = listOf("kotlin", "swift", "dart")
val upperCaseList: List<String> = list.map(String::toUpperCase)
print(upperCaseList) // 出力: [KOTLIN, SWIFT, DART]
条件で絞り込む:filter
要素を条件で絞り込むにはfilter(predicate: (T) -> Boolean)
メソッドを使用します。例えば以下は偶数のみ抽出する方法です。
val list: List<Int> = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val evenList: List<Int> = list.filter { it % 2 == 0 }
print(evenList) // 出力: [2, 4, 6, 8, 10]
要素を並び替える:sorted
要素を並び替えるにはsorted
メソッドを使用します。
val numbers: List<Int> = listOf(5, 3, 8, 1, 2)
val sortedNumbers: List<Int> = numbers.sorted()
println(sortedNumbers) // 出力: [1, 2, 3, 5, 8]
またsortedBy(selector: (T) -> R)
メソッドを使用することでソート対象を指定することが可能です。
val users: List<User> = listOf(
User("ame", 25),
User("mahiro", 30),
User("takeru", 20)
)
val sortedByName: List<User> = users.sortedBy { it.name }
val sortedByAge: List<User> = users.sortedBy { it.age }
print(sortedByName) // [User(name=ame, age=25), User(name=mahiro, age=30), User(name=takeru, age=20)]
print(sortedByAge) // [User(name=takeru, age=20), User(name=ame, age=25), User(name=mahiro, age=30)]
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。