要素を一つ取り出す
Kotlinのコレクションは、コレクションから要素を一つ取り出すための一連の関数を提供します。 このページに書かれている関数は、セットとリストの両方に使う事が出来ます。
リストの定義で述べたように、 リストは順番のあるコレクションです。 つまり、各要素にはポジションがあり、それを使って要素を参照する事が出来ます。 このページに書かれた関数たちに加えて、リストはインデックスによる、より広範な要素の取得や検索方法を提供します。 より詳しくは、リスト特有のオペレーションを参照ください。
一方、セットは定義により、順番の無いコレクションです。
しかしながら、KotlinではSetは要素をある順番で格納しています。
これらの順番は挿入した順番だったり(LinkedHashSetの場合)、自然なソートの順番(natual sorted order)だったり(SortedSetの場合)、
またそれ以外の場合も考えられます。
セットの要素の順番が不明な場合もあります。
そのような場合、要素はそれでも何らかの順番で並べられていて、
要素の位置に依存するような関数は何かの結果を返す事は出来ます。
ですが、そのような結果はSetの特定の実装を呼ぶ人が知っている場合を除いては予測不能となります。
位置による取り出し
指定した位置にある要素を取り出すための、elementAt()という関数があります。
この関数を整数の引数で呼び出すと、渡した位置にある要素を受け取る事になります。
最初の要素は位置0で、最後の要素の位置は(size - 1)です。
elementAt()はインデックスアクセスを提供してないコレクションや、または静的にはその提供が分からないようなケースで便利です。
Listの場合は、インデックスアクセス演算子(get() あるいは [])を使う方がより慣用的(idiomatic)です。
コレクションの最初と最後の要素を取り出す便利なエイリアスもあります: first()
と last()です。
存在しない位置で要素を取り出してしまった時のexceptionを避けるためには、elementAt()のセーフな亜種を使ってください:
elementAtOrNull()はコレクションの範囲の外の位置を指定するとnullを返します。elementAtOrElse()は追加のラムダ関数をとります。そのラムダ関数 はIntの引数を要素の型にマップするものです。 範囲外の位置で呼ぶと、elementAtOrElse()は指定された値でのラムダの結果を返します。
条件による取り出し
first() と last()関数は、
与えた条件にマッチする要素を探し出すのにも使えます。
first()をコレクションの要素に対する述語(predicate)とともに呼び出すと、述語が最初にtrueを返した要素を返します。
同様に、last()を述語つきで呼び出すと、最後に述語がマッチした要素を返します。
どの要素も述語にマッチしない場合は、どちらの関数も例外を投げます。
例外を避けたければ、firstOrNull()
と lastOrNull() を代わりに使いましょう:
これらの関数はマッチする要素が見つからなければどちらもnullを返します。
もし用途によりふさわしいと思うなら、以下のエイリアスを使いましょう:
find()はfirstOrNull()の代わりに使えますfindLast()はlastOrNull()の代わりに使えます
セレクタによる取り出し
要素を取り出す前にマップをする必要があるなら、 firstNotNullOf()関数があります。
これは2つのアクションを一気に行います:
- コレクションをセレクタ関数でマップします
- 結果の最初の非null値を返します
firstNotNullOf()は、結果のコレクションに非nullの要素がなければNoSuchElementExceptionを投げます。
その場合にnullを返して欲しければ、firstNotNullOfOrNull() を使いましょう。
ランダムな要素
コレクションの要素を何かてきとうに取り出したい場合は、random()関数を使うと良いでしょう。
引数無しで呼び出す事も出来ますし、ランダムさの元としてRandomオブジェクトを引数に呼び出す事も出来ます。
空のコレクションに対してrandom()を呼ぶと例外が投げられます。
代わりにnullを受け取りたければ、randomOrNull()を使いましょう。
要素が存在するかを確認する
コレクションにある要素が存在するかどうかを確認したければ、contains()関数を使いましょう。
この関数は、渡された引数とequals()な要素がコレクションにあればtrueを返します。
inキーワードを使ってオペレータの形で、contains()を呼び出す事も出来ます。
複数のインスタンスが存在するかをまとめてチェックしたければ、containsAll()をそのチェックしたいインスタンスのコレクションを引数に呼び出せばよろしい。
さらに、要素のどれか一つを含んでいるかをチェックしたければ、
isEmpty()かisNotEmpty()が使用出来ます。