みんからきりまで

きりみんです。

Kotlinのリスト操作関数まとめ

長らくご参照頂いたこのエントリですが、最新版をQiitaに書いたので今後はそちらをご利用ください

qiita.com

Kotlinのリスト操作関数、便利なんだけど関数型言語の知見が無い為いつも欲しい機能を探すのに時間を奪われる。
なので適当に調べて備忘メモ。
Kotlin独自ってものはあんまりない気がするので他の言語でもだいたい同じっぽい。

変換系

map

・リストの中身を1つずつ処理して別のリストに変換する

arrayOf(1, 2, 3).map { num -> "num:" + num }

1, 2, 3

"num:1", "num:2", "num:3"

flatMap

・2次元リストをフラット(1次元)リストに変換する ※mapのリストを分解する版

arrayListOf(arrayListOf(1, 2, 3), arrayListOf(4, 5, 6)).flatMap { num -> num }

[[1, 2, 3], [4, 5, 6]]

[1, 2, 3, 4, 5, 6]

抽出系

filter

・trueを返した要素だけ抽出する

arrayOf(1, 2, 3).filter { num -> num != 2 }

1, 2, 3

1, 3

filterNot

・falseを返した要素だけ抽出する

take

・指定した数だけ要素を抽出する

arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).take(4)

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

1, 2, 3, 4

takeLast

・後ろから数えて指定した数だけ要素を抽出する

arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).takeLast(4)

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

6, 7, 8, 9, 10

drop

・先頭から指定した数だけ要素を捨てる

arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).drop(4)

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

5, 6, 7, 8, 9, 10

single

・trueを返した要素が1つならそのまま返し、空もしくは複数ならExceptionを投げる

arrayOf(1, 2, 3, 1).single { num -. num == 1 }

1, 2, 3

1

1, 1, 2

IllegalArgumentException: Collection contains more than one matching element.

singleOrNull

・trueを返した要素が1つならそのまま返し、空もしくは複数ならnullを返す

arrayOf(1, 2, 3).singleOrNull { num -. num == 1 }

1, 2, 3

1

1, 1, 2

null

max

・最大値を返す

arrayOf(1, 2, 3).max()

1, 2, 3

3

min

・最小値を返す

arrayOf(1, 2, 3).max()

1, 2, 3

1

maxBy, minBy

・返した要素を使用して最大値, 最小値を返す

arrayOf("a", "aaa", "aa").maxBy { s -> s.length() }

"a", "aaa", "aa"

"aaa"

distinct

・重複を削除する

arrayOf(1, 2, 1, 2).distinct()

1, 2, 1, 2

1, 2

distinctBy

・返した要素で重複を削除する

arrayOf("abc", "de", "fgh", "i", "jk").distinctBy { s -> s.length() }

"abc", "de", "fgh", "i", "jk"

"abc", "de", "i"

first

・最初の要素を返す

last

・最後の要素を返す

ソート系

sort

・並び替える

arrayOf(2, 1, 3).sort()

2, 1, 3

1, 2, 3

sortBy

・返した要素を使用して並び替える

arrayOf("a", "aaa", "aa").sortBy { s -> s.length() }

"a", "aaa", "aa"

"a", "aa", "aaa"

sortDescendingBy

・返した要素を使用して降順に並び替える

reverse

・要素を逆順にする

・並び替える

arrayOf(1, 2, 3).reverse()

1, 2, 3

3, 2, 1

判定系

all

・全ての要素が条件に一致すればtrue

arrayOf(1, 2, 3, 4).all { num -> num < 10 }

true

any

・どれかの要素が条件に一致すればtrue

arrayOf(1, 20, 300, 4000).any { num -> num < 10 }

true

isEmpty, isNotEmpty

・リストが空ならtrue、Notは逆

none

・条件に一致する要素が無ければtrue

arrayOf(1, 2, 3, 4).none { num -> num > 10 }

true

計算系

sum

・合計値を返す

average

・平均値を返す

reduce, reduceRight

・要素に対して再帰的に関数を適用し、一つの値にまとめる ・reduceは前から、reduceは後ろから要素を取り出す

arrayOf("a", "b", "c", "d", "e", "f", "g").reduce { s1, s2 -> s1 + s2 }

"a", "b", "c", "d", "e", "f", "g"

"abcdefg"

※この例では
"a" + "b" →"ab" + "c" →"abc" + "d" のように順番に要素を足している

fold, foldRight

・初期値を与えられるreduce

arrayOf("a", "b", "c", "d", "e", "f", "g").fold("first:") { s1, s2 -> s1 + s2 }

"a", "b", "c", "d", "e", "f", "g"

"first:abcdefg"

合成系

plus

・2つのリストを結合する

arrayOf(1, 2, 3).plus(arrayOf(4, 5))

1, 2, 3
4, 5

1, 2, 3, 4, 5

zip

・2つのリストの要素をペアにして返す。あまりは捨てられる

arrayOf(1, 2, 3, 4).zip(arrayOf("a", "b", "c"))

1, 2, 3, 4
"a", "b", "c"

[[1, "a"], [2, "b"], [3, "c"]]

marge

・2つのリストの要素に関数を適用して合成する。あまりは捨てられる

arrayOf("a", "b", "c", "d").merge(arrayOf("1", "2", "3")) { s1, s2 -> s1 + ":" + s2 }

"a", "b", "c", "d"
"1", "2", "3"

"a:1", "b:2", "c:3"

処理系

forEach

・要素に対して順番に関数を実行する

forEachIndexed

・要素に対して順番に関数を実行する。要素と一緒にindexも受け取れる