blog

Kotlinの基本 - コレクションのための関数API

filter関数とmap関数はコレクション操作の基礎を形成し、多くのコレクション操作はこれらの助けを借りて表現されます。 上記の結果は、判定を満たす入力コレクションの要素のみを含む新しいコレクションで...

Apr 11, 2020 · 4 min. read
Share this

I. 基本:フィルターとマップ

フィルターマップ***関数は、集合操作の基礎となるもので、多くの集合操作がこの関数によって表現されています。

  • ***filter***
>>> val list = listOf{1,2,3,4}
// 残ることができるのは偶数だけだ。
>>> println(list.filter { it % 2 == 0 }
[2,4]

上記の結果は、判定を満たす入力セットの特定の要素だけを含むものです。

  • ***filter***
>>> val people = listOf(Person("Alice", 29), Person("Bob", 31))
>>> println(people.filter { it.age > 30 }
[Person(name=Bob, age=31)]

.

  • ***map***
>>> val list = listOf(1,2,3,4)
>>> println(list.map{ it * it })
[1,4,9,16]

II. "all"、"any"、"count"、"find": コレクションへの応用判断

コトリン

  • コレクション内のすべての要素が特定の条件を満たすかどうかをチェックします。
  • count***関数は、判定式を満たす要素がいくつあるかを調べます。
  • find***関数は、条件にマッチする最初の要素を返します。
// 判断力のあるcanBeInClub27
val canBeInClue27 = { p: Person -> p.age <= 27 }
// すべての要素が判定を満たすかどうかが重要であり、all関数を使用すべきである。
>>> val people = listOf(Person("Alice", 27), Person("Bob", 31))
>>> println(people.all(canBeInClub27))
false
// セット内に少なくとも1つのマッチする要素があるかどうかをチェックするには、任意の
>>> println(people.any(canBeInClue27))
true

注目してください

条件を追加することは、***any***とその条件の逆数に置き換えることができます。

count***関数は、判定式を満たす要素の数をカウントします。

  • ***count***
>>> val people = listOf(Person("Alice", 27), Person("Bob", 31))
>>> println(people.count(canBeInClub27))
1

仕事をこなすために正しい関数を使う:"カウント "と "サイズ"

countメソッドは忘れがちで、コレクションにフィルタをかけてからサイズ解除することで実装します:

`println(people.filter(canBeInClub27).size)

この場合、中間コレクションが作成され、判定式を満たすすべての要素を格納するために使用されます。一方、**は要素そのものを気にしないので、より効率的です。一般的なルール: ニーズに最も適した操作を見つけるようにしてください。

find***関数は、判定式を満たす最初の要素を見つけます。

  • ***find***
>>> val people = listOf(Person("Alice", 27), Person("Bob", 31))
>>> println(people.find(canBeInClub27))
Person(name=Alice, age=27)

複数の要素がマッチした場合は最初の要素を、判定を満たす要素がない場合は null を返します。 find には同義のメソッド firstOrNull もあります。

第三に、groupBy: リストはマップのグループに変換されます。

すべての元素を異なる特性に従ってグループに分けます。

  • ***groupBy***
>>> val people = listOf(Person("Alice", 27), Person("Bob", 27), Person("Cartol", 31))
// この操作の結果は、要素グループ化の基となるキーと要素グループ化との間のマップである。
>>> println(people.groupBy{ it.age })
{29=[Person(name=Bob, age=29)],
 30=[Person(name=Alice, age=31)], Person(name=Carol, age=31)]}

このマップはmapKeysやmapValuesのような関数を使ってさらに修正することができます。このマップは mapKeys や mapValues のような関数を使ってさらに修正することができます。

IV.flatMapとflatten: 入れ子になったコレクションの要素の処理

Book***クラス表現を使用することを想定しています:

// 定義
クラス Book(val title: String, val anthors: List<String>)
// books "コレクションに収録されている本を書いたすべての著者を含むセット。
books.flatMap { it.authors }.toSet()

flatMap***関数は2つのことを行います:

  • 1. 実数参照として与えられた関数に従って、集合の各要素に対して変換を行います;
  • 2.複数のリストを1つのリストに統合します。
>>> val strings = listOf("abc", "def")
>>> println(strings.flatMap { it.toList() }
[a,b,c,d,e,f]

flatten***関数:変換は必要なく、コレクションを平坦化するだけです:listOfLists.flatten()

コレクションに関するコードを書くときの一般的なアドバイスは、この操作が汎用変換の観点からどのように表現できるかを考え、この変換を実行するライブラリ関数を探すことです。

Read next

Redisメモリの最適化

集約されたデータ型Hash、List、Set、Sorted SetがすべてIntegerで構成されている場合、またはそのサイズが一定値以下の場合、Redisはそれらを非常にメモリ効率の良い方法でエンコードし、最大で10倍のメモリ量を節約します。 特殊エンコーディングのサイズが設定値を超えると、Redisは特殊エンコーディングを...

Apr 10, 2020 · 4 min read