Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Collectionの罠

 Collectionの罠

417_72kiさんが10.25and factory beer bash #4 若手エンジニアLT - スマホアプリ開発あるある編で登壇した資料です。

andfactory, inc.

October 25, 2018
Tweet

More Decks by andfactory, inc.

Other Decks in Programming

Transcript

  1. COLLECTION操作の罠 Navigate : Space / Arrow Keys | - Menu

    | - Fullscreen | - Overview | - Blackout | - Speaker | - Help M F O B S ?  1 / 28
  2. Profile Takuhiro Muta iOS Enginner@iRidge inc. Twitter/Qiita: @417_72ki GitHub: 417-72KI

    [ GitPitch @ github/417-72KI/Slides4LT/trap-of-collections ]  2 / 28
  3. 昔 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
  4. 今 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
  5. 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
  6. 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
  7. 分かりやすいように画面出力してみましょう 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
  8. 実行結果 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
  9. イメージ 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
  10. さっきの例 これを 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
  11. こうじゃ 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
  12. 実行結果 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
  13. イメージ 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
  14. 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
  15. 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