Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Collectionの罠
Search
andfactory, inc.
October 25, 2018
Programming
0
190
Collectionの罠
417_72kiさんが10.25and factory beer bash #4 若手エンジニアLT - スマホアプリ開発あるある編で登壇した資料です。
andfactory, inc.
October 25, 2018
Tweet
Share
More Decks by andfactory, inc.
See All by andfactory, inc.
UIViewのレイアウト更新メソッドを整理する
andfactory
0
420
Android開発初心者にありがちなこと
andfactory
0
240
Codableあるある
andfactory
0
210
Androidエンジニアあるある
andfactory
0
250
Cocoa Touch Frameworkあるある
andfactory
0
340
iOS開発に慣れてきた時にやりがちあるある
andfactory
0
200
社内勉強会資料 - スクラム・アジャイル開発
andfactory
0
600
Other Decks in Programming
See All in Programming
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
120
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
150
Pulsar2 を雰囲気で使ってみよう
anoken
0
230
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
250
ASP. NET CoreにおけるWebAPIの最新情報
tomokusaba
0
360
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
240
Lottieアニメーションをカスタマイズしてみた
tahia910
0
120
『品質』という言葉が嫌いな理由
korimu
0
160
Rails アプリ地図考 Flush Cut
makicamel
1
110
社内フレームワークとその依存性解決 / in-house framework and its dependency management
vvakame
1
550
Grafana Cloudとソラカメ
devoc
0
140
SpringBoot3.4の構造化ログ #kanjava
irof
2
980
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
223
9.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Docker and Python
trallard
44
3.3k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Building an army of robots
kneath
302
45k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Visualization
eitanlees
146
15k
Unsuck your backbone
ammeep
669
57k
Rails Girls Zürich Keynote
gr2m
94
13k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Facilitating Awesome Meetings
lara
51
6.2k
Transcript
COLLECTION操作の罠 Navigate : Space / Arrow Keys | - Menu
| - Fullscreen | - Overview | - Blackout | - Speaker | - Help M F O B S ? 1 / 28
Profile Takuhiro Muta iOS Enginner@iRidge inc. Twitter/Qiita: @417_72ki GitHub: 417-72KI
[ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 2 / 28
本題 [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 3 / 28
Objective-CからSwift JavaからKotlin(またはJava8) になるに従って コレクション操作が大幅に楽になりました [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ]
4 / 28
昔 Objective-C Java(~7) NSArray *array = ... NSArray *evenArray =
[NSMutableArray new]; for (NSNumber *num in array) { if(num.integerValue % 2 == 0) { [evenArray addObject:num]; } } List<Integer> list = ... List<Integer> evenList = new ArrayList<>(); for(int num: list) { if(num % 2 == 0) { evenList.add(num); } } [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 5 / 28
今 Swift Kotlin let list = [1,2,3,4,...] let evenList =
list.filter { $0 % 2 == 0 } val array = arrayOf(1,2,3,4,...) val evenList = array.filter { it % 2 == 0 }.toTypedArray() [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 6 / 28
ちょっと複雑な例 [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 7 / 28
let range = 1...10 let newList = range.filter { $0
% 2 == 0 } .map { $0 / 2 } .map { $0 * 5 } .filter { $0 > 10 } [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 8 / 28
map と filter の定義 public func map<T>(_ transform: (Element) throws
-> T) rethrows -> public func filter(_ isIncluded: (Element) throws -> Bool) rethrow [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 9 / 28
どちらも配列を返している... [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 10 / 28
分かりやすいように画面出力してみましょう func multiply(_ i: Int) -> (Int) -> Int {
return { print($0, "*" , i, "=", $0 * i) return $0 * i } } func divide(_ i: Int) -> (Int) -> Int { return { print($0, "/" , i, "=", $0 / i) return $0 / i } } func isOdd() -> (Int) -> Bool { return { print($0, "odd?" , $0 % 2 == 0) return $0 % 2 == 0 [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 11 / 28
実行結果 1 odd? false 2 odd? true 3 odd? false
4 odd? true 5 odd? false 6 odd? true 7 odd? false 8 odd? true 9 odd? false 10 odd? true 2 / 2 = 1 4 / 2 = 2 6 / 2 = 3 8 / 2 = 4 10 / 2 = 5 1 * 5 = 5 [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 12 / 28
イメージ List<Integer> l = new ArrayList<>(); for (int n: array)
if (isOdd(n)) l.add(n); List<Integer> l2 = new ArrayList<>(); for (int n: l) l2.add(divide(n, 2)); List<Integer> l3 = new ArrayList<>(); for (int n: l2) l3.add(multiply(n, 5)); List<Integer> result = new ArrayList<>(); for (int n: l3) if (isMoreThan(n, 10)) result.add(n); [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 13 / 28
ループ回しすぎぃ! [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 14 / 28
これが要素数100万とかの配列になったら... [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 15 / 28
((((;゚Д゚)))) [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 16 / 28
そこで [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 17 / 28
Swift → LazyCollection Kotlin → Sequence [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections
] 18 / 28
どちらも遅延評価で実行してくれる [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 19 / 28
さっきの例 これを var list = 1...10 let newList = list.filter(isOdd())
.map(divide(2)) .map(multiply(5)) .filter(isMoreThan(10)) [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 20 / 28
こうじゃ var list = 1...10 let newList = list.lazy .filter(isOdd())
.map(divide(2)) .map(multiply(5)) .filter(isMoreThan(10)) .reduce(into: [Int] ()) { (array: inout [Int], i: Int) in arr [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 21 / 28
実行結果 1 odd? false 2 odd? true 2 / 2
= 1 1 * 5 = 5 5 > 10 : false 3 odd? false 4 odd? true 4 / 2 = 2 2 * 5 = 10 10 > 10 : false 5 odd? false 6 odd? true 6 / 2 = 3 3 * 5 = 15 15 > 10 : true 7 odd? false [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 22 / 28
イメージ 1ループで回す感じに List<Integer> result = new ArrayList<>(); for (int n:
array) { if (!isOdd(n)) continue; int n2 = divide(n, 2); int n3 = multiply(n2, 5) if (isMoreThan(n3, 10)) result.add(n3); } [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 23 / 28
ちなみにKotlinの場合は array.asSequence() をmapとかfilterとかの前に 呼ぶだけ [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ]
24 / 28
どういう時に有効? 大きいデータから複数の条件に合致する数件だけを 抽出する [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 25
/ 28
Before 実行時間: 0.7900744676589966 let range = 1...1000 let result1 =
range .filter(isOdd()) .map(divide(2)) .map(multiply(5)) .filter(isMoreThan(10)) .prefix(5) [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 26 / 28
After 実行時間: 0.00704646110534668 let range = 1...1000 let result2 =
range.lazy .filter(isOdd()) .map(divide(2)) .map(multiply(5)) .filter(isMoreThan(10)) .prefix(5) .reduce(into: [Int] ()) { (array: inout [Int], i: Int) in arr [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 27 / 28
まとめ 膨大なコレクションを操作する際は遅延評価の検討 を! [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ] 28
/ 28