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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
andfactory, inc.
October 25, 2018
Programming
0
200
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
440
Android開発初心者にありがちなこと
andfactory
0
250
Codableあるある
andfactory
0
220
Androidエンジニアあるある
andfactory
0
260
Cocoa Touch Frameworkあるある
andfactory
0
350
iOS開発に慣れてきた時にやりがちあるある
andfactory
0
210
社内勉強会資料 - スクラム・アジャイル開発
andfactory
0
620
Other Decks in Programming
See All in Programming
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
250
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
Data-Centric Kaggle
isax1015
2
760
高速開発のためのコード整理術
sutetotanuki
1
390
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
550
Package Management Learnings from Homebrew
mikemcquaid
0
210
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
970
Fragmented Architectures
denyspoltorak
0
150
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
380
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
Featured
See All Featured
Speed Design
sergeychernyshev
33
1.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
820
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
410
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
0
270
It's Worth the Effort
3n
188
29k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
580
Marketing to machines
jonoalderson
1
4.6k
Site-Speed That Sticks
csswizardry
13
1.1k
From π to Pie charts
rasagy
0
120
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
220
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3k
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