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
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Collectionの罠
417_72kiさんが10.25and factory beer bash #4 若手エンジニアLT - スマホアプリ開発あるある編で登壇した資料です。
andfactory, inc.
October 25, 2018
More Decks by andfactory, inc.
See All by andfactory, inc.
UIViewのレイアウト更新メソッドを整理する
andfactory
0
450
Android開発初心者にありがちなこと
andfactory
0
250
Codableあるある
andfactory
0
230
Androidエンジニアあるある
andfactory
0
260
Cocoa Touch Frameworkあるある
andfactory
0
360
iOS開発に慣れてきた時にやりがちあるある
andfactory
0
220
社内勉強会資料 - スクラム・アジャイル開発
andfactory
0
640
Other Decks in Programming
See All in Programming
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
500
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
190
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
400
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
360
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
260
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
150
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
200
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
670
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
230
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Featured
See All Featured
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
190
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
Making Projects Easy
brettharned
120
6.7k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
610
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
Navigating Weather and Climate Data
rabernat
0
390
Scaling GitHub
holman
464
140k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Test your architecture with Archunit
thirion
1
2.3k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
The Limits of Empathy - UXLibs8
cassininazir
1
520
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