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

この記事からわかること

  • Android/KotlinListとは?
  • コレクション型の種類
  • MutableListArrayListとの違い
  • 要素追加削除する方法
  • フィルターソートmap使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:enum classes

環境

Android/KotlinのListとは?

KotlinのListデータを複数保持できるコレクション型の1つとして定義されたデータ型です。似たようなデータ型に配列(Array)がありますが、配列はプリミティブ型(基本的な型)として定義されたデータ型です。

Listは要素を複数保持できたり、要素が順序付けされて管理されていることでインデックスでアクセスできたりと基本的には配列と同じような機能を持っています。

Listの継承関係と種類

Listの中にも種類が分かれており、シンプルなListMutableListArrayListなどに分かれています。定義をみてみると以下のような継承関係になっていました。

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)なコレクションとして定義されており、要素の変更や追加ができません。生成するにはlistOflistOfNotNullメソッドを使用します。

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]

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]

ArrayList

ArrayListMutableList同様に可変な(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との違い

MutableListArrayListは一見全く同じに見えますが、そもそも定義が異なります。MutableListinterfaceで定義されており抽象的なクラスです。一方ArrayListclassなので具体的な実装になります。

interface MutableList<E> : List<E>, MutableCollection<E>
  
class ArrayList<E> : MutableList<E>, RandomAccess

またArrayListJavaのArrayListと対応しており、Kotlinから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)]

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index