Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Collectionを使いこなす

2,613 views

Published on

R.kt #2の発表資料です
https://recruit-lifestyle.connpass.com/event/71881/

Published in: Engineering
  • Be the first to comment

Collectionを使いこなす

  1. 1. Collectionを使いこなす Naoto Nakazato
  2. 2. 自己紹介 ● Naoto Nakazato ● Recruit Lifestyle ● HOT PEPPER Beauty ● アカウント ○ Twitter: @oxsoft ○ Facebook: naoto.nakazato ○ GitHub: oxsoft ○ Qiita: oxsoft
  3. 3. 今日お話しすること 「Javaが書ければKotlinも書ける」は真実 でも「Kotlinっぽく」書けている? Collectionを使いこなせるとカッコイイ ※Kotlin初級〜中級者向けです
  4. 4. KotlinにおけるCollection
  5. 5. KotlinにおけるCollection Iterable Collection Set List Map Mutable Iterable Mutable Collection Mutable Set Mutable List Mutable Map
  6. 6. その他のIterableまわりクラス Iterable Sequence IntProgression ClosedRange IntRange
  7. 7. ListとMutableList 実体はどちらもArrayList val list1 = listOf(1, 2, 3) val list2 = mutableListOf(1, 2, 3) println(list1::class.java.simpleName) // ArrayList println(list2::class.java.simpleName) // ArrayList
  8. 8. ImmutableとRead Only ListはRead OnlyであってImmutableではない (Immutable警察のおかげでだいぶ浸透した話ですが) val mutableList: MutableList<Int> = mutableListOf(1, 2, 3) val list: List<Int> = mutableList println(list) // [1, 2, 3] mutableList.add(4) println(list) // [1, 2, 3, 4]
  9. 9. ListとMutableListの共変性 List<out E> は共変だが、MutableList<E> は不変 val intList: List<Int> = listOf(1, 2, 3) val anyList: List<Any> = intList // OK // anyListは読み取り専用なのでStringなどを追加できない val intMutableList: MutableList<Int> = mutableListOf(1, 2, 3) val anyMutableList: MutableList<Any> = intMutableList // Type mismatch! anyMutableList.add("String") // ここのミスマッチを事前に阻止している
  10. 10. 生成方法 基本的にはlistOf、setOf、mapOf 取り出し順序やパフォーマンスを気にする場合は適切なクラスを使う setOf(1, 2, 3) // LinkedHashSet linkedSetOf(1, 2, 3) // LinkedHashSet hashSetOf(1, 2, 3) // HashSet sortedSetOf(1, 2, 3) // TreeSet
  11. 11. 使いこなす
  12. 12. 条件による要素変更 Javaっぽく val list = mutableListOf(1, 2, 3) if (condition) list.add(4) return list
  13. 13. 条件による要素変更 Javaっぽく Kotlinっぽく ※ただしパフォーマンスを気にする場合はJavaっぽく書いたほうが良い val list = mutableListOf(1, 2, 3) if (condition) list.add(4) return list val fourth = if (condition) listOf(4) else emptyList() return listOf(1, 2, 3) + fourth
  14. 14. 2つのリストを同時に扱う 長さが同じ2つのリストを同時に扱いたい (本当は1つのクラスにまとめる方が良いが、APIなどの制約でできない場合) Javaの場合はlengthの小さい方でfor文を回すなど val nameList = listOf("Alice", "Bob", "Charlie") val ageList = listOf(20, 25, 30) // [Alice(20), Bob(25), Charlie(30)] が欲しい
  15. 15. 2つのリストを同時に扱う zipを使うと簡単にできる(個数は短い方になる) val nameList = listOf("Alice", "Bob", "Charlie") val ageList = listOf(20, 25, 30) nameList.zip(ageList) { name, age -> "$name($age)" } // [Alice(20), Bob(25), Charlie(30)]
  16. 16. リストを分割する 例:A~Zをリクエストしたいけど、1回にリクエストできるのは10個までなので、3回に 分けてリクエストする val idList = 'A'..'Z' val request = // [[A,B,……,J],[K,L,……,T],[U,V,……,Z]] を得たい
  17. 17. リストを分割する インデックスを付けてグループ分けする val idList = 'A'..'Z' val request = idList .withIndex() .groupBy({ it.index / 10 }, { it.value }) .values A, B, C, … (0, A), (1, B), (2, C), … {0:[A, B, C, …], 1:[K, …], …} [[A, B, …, J], [K, L, …], …]
  18. 18. クエリパラメータをMapに変換する /index.html?key1=value1&key2=value2&key3=value3 を、 {key1=value1, key2=value2, key3=value3} のMapに変換したい
  19. 19. クエリパラメータをMapに変換する ※↑はアンカーや不正なURLを考慮していないので、  バリデーションなどには使わない下さい val path = "/index.html?key1=value1&key2=value2&key3=value3" val query = path.substringAfter("?") .split("&") .map { it.split("=") } .associate { it[0] to it[1] } println(query) // {key1=value1, key2=value2, key3=value3}
  20. 20. allとanyとnone all { it == 0 } 全てがゼロ ならば true any { it == 0 } どれかがゼロ ならば true none { it == 0 } どれもゼロじゃない ならば true
  21. 21. allとanyとnone 否定「!」を使わずに書く方法を考える !list.any { it != 0 } list.none { it != 0 } list.all { it == 0 } !list.all { it != 0 } !list.none { it == 0 } list.any { it == 0 } list.all { it != 0 } !list.any { it == 0 } list.none { it == 0 }
  22. 22. allとanyとnone 否定「!」を使わずには書けない場合もある 例:「どれかが 0 じゃなければ true」 !list.all { it == 0 } list.any { it != 0 } !list.none { it != 0 }
  23. 23. おまけ どんなリストになる? generateSequence(0 to 1) { (a, b) -> b to a + b }.map { it.second } 1 1 1 2 2 3 3 5 0 1 ← 2つ目を抜き出す
  24. 24. おまけ フィボナッチ数列になる 実務での使い所が難しいオペレータも結構ある val fib = generateSequence(0 to 1) { (a, b) -> b to a + b }.map { it.second } println(fib.take(10).toList()) // [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
  25. 25. まとめ var や mutableList を宣言していろいろやるコードを書く前に考える いろいろなオペレータがあるので調べてみると面白い 「 foreach / if → filter / foreach 」みたいなパターンを覚えると良さそう ご清聴ありがとうございました

×