SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
scala.collection 再入門(改)
脱・初中級者を目指して[ver.2.12.0-M5対応版] @Scala関西Summit2016
amaya@amaya382
 ITO Ryuichi(@amaya382)
 大学院でGraphProcessingEngineとかNLPとか
 Scalaっぽいこと
 Scala関西Summitお手伝い組
 Functional Programming in Scala読書会(次回は10/30)
 Scala(入門レベル)を薄い技術書に書きまとめたい…夏コミ(?)
tags: scala,c#,カイオーガ,きんモザ,ボカロ,splatoon,μ's
誰
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 2
「サンプルが List を使っていたから…」と
なんとなく List を使っていませんか
配列に謎の安心感を抱いて
なんとなく Array を使っていませんか
「Scala と言えばとにかく immutable」と
immutable に固執していませんか
高階関数が楽しくて
なんとなくチェインさせていませんか
適材適所で
Collection や操作方法を選択しましょう
💪 Scalaにおける 💪
💪 アルゴリズムとデータ構造力を鍛える 💪
 種類編
 scala.collection を Traversable から辿ってみる
 操作編
 for式?メソッドチェーン? 色々な操作方法とその仕組み
 もう一歩踏み込むためのTips編
 メソッドチェーンとの良い付き合い方
 遅延評価
 アンチパターンと愉快な仲間たち
Contents
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 9
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 10
 コレクションメソッドの細かい話
 scala.collection.parallel
 Gen~
 Par~
 詳しい実装の話
 ~Like
 その他実用性が低そうな部分
 モナモナしません
今回やらないこと
種類編
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 11
scala.collection をどれだけ把握できていますか?
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 13
Trait
Class
Array
Seq
List
Range
e.g. 1 to 10
http://docs.scala-lang.org/resources/images/collections.immutable.png
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 14
Trait
Class
http://docs.scala-lang.org/resources/images/collections.mutable.png
多い
どれ使えばいいの
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 15
Trait
Class
探索可能トレイト
foreach できる
繰り返し可能トレイト
Iterator を使って
foreach できる
集合トレイト
ユニークな値の集ま
り
辞書トレイト
key-value な
値の集まり
ソート
済!
ソート
済!
順序付きトレイ
ト
インデックスで
アクセス可能
線形トレイト
ポインタで
繋がれてる
索引済みトレイト
インデックスによる
ランダムアクセスに強
い
List
List
HashSet
HashMap
Vector
List
List
immutable(デフォルト)
※apply の実装により, Trait であってもデフォルト実装の Collection としての初期化が可能
デフォルト実
装
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 16
 Set, Map
 HashSet, HashMap
 TreeSet, TreeMap
 IndexedSeq
 Range
 Vector
 LinearSeq
 List
 Stream
 Queue
 Array (後ほど)
Pick up!
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 17
 Iterator
 データ群を舐めるための抽象的なデータ構造・手法
 Collection が内部的に用いる(has-a)
 Collection ごとに適切なデータの舐め方を実装する
 e.g. List => head :: tail
 next() / hasNext()
 最終的には NoSuchElementException
… 終端
 Iterable
 Iterator を提供できる Collection を表す Trait
 全ての Scala の Collection が継承している(is-a)
(補足) Iterator / Iterable
scala> val iter = Iterator(0, 1, 2)
iter: Iterator[Int] = non-empty iterator
scala> iter.foreach(println)
0
1
2
scala> iter.foreach(println)
scala>
scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
scala> list.iterator.foreach(println)
1
2
3
scala> list.iterator.foreach(println)
1
2
3
保有データをIteratorの形でコピー
状態(ポインタ)を持つ
ポインタが終端まで進ん
だ
※foreach等には
直接は利用されないことも
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 18
 Map ≒ Set の値を key に, 加えて value をポインタとして保持
 ベースとなるデータ構造はほとんど等しい
(補足) Set と Map
イエロー,
ピンク,
グリーン,星空凛
小泉花陽
矢澤にこ
keys values
Set
Map
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 19
 Trie(32分木) + Hash
 検索・追加・削除 が 実質 o(1)
 どの操作も速い
 Set, Map のデフォルト実装
 使い道: 重複のない集合(辞書)を
immutable で使いたい時
immutable.{HashSet, HashMap}
scala> val x = scala.collection.immutable.HashSet(1, 2, 3)
x: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)
※Map[整数, _] に特化した IntMap, LongMap もあるよ
32 32 32
1024
Hash値で
振り分け
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 20
 赤黒木
 検索・追加・削除 が o(logn)
 どの操作もそれなりに速い
 ソート済み
 SortedSet, SortedMapのデフォルト実装
 使い道: 重複のない集合(辞書)を
ソート済みで扱いたい時
最悪計算量を重視する時
immutable.{TreeSet, TreeMap}
scala> val x = scala.collection.immutable.TreeSet(1, 2, 3)
x: scala.collection.immutable.TreeSet[Int] = TreeSet(1, 2, 3)
Nil Nil
Nil Nil
Nil Nil Nil Nil Nil
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 21
 範囲を表現しているだけ
 head・tail・ランダムアクセス が o(1)
 値を追加するようなことはできない
 to, until, by, 負値(逆順)
 使い道: 範囲の決められた値のコレクションを扱う時
e.g. ループ用のインデックス
immutable.Range
scala> val x = scala.collection.immutable.Range(1, 5, 2)
x: scala.collection.immutable.Range = Range 1 until 5 by 2
scala> val x = 1 until 5 by 2
x: scala.collection.immutable.Range = Range 1 until 5 by 2
※注意: ver 2.8より前はチェーン先が遅延評価, 以降は正格評価
1 until 5
1, 2, 3, 4
5 to 1 by -2
5, 3, 1
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 22
 32分木
 head・tail・ランダムアクセス・更新
・先頭追加・末尾追加・length が 実質 o(1)
 カタログスペック最強 … だが定数大きめ
 ランダムアクセスに強く, その他もそれなり
 IndexedSeq のデフォルト実装
Range のデフォルト変換先
 使い道: ランダムアクセスを中心に
色々な操作をする時
immutable.Vector
scala> val x = scala.collection.immutable.Vector(1, 2, 3)
x: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
scala> val x = scala.collection.immutable.IndexedSeq(1, 2, 3)
x: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3)
※java.util.Vector とは関係ありません!!!
32 32 32
1024
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 23
 単方向連結リスト. 再帰と相性◎
 head・tail・先頭追加 が o(1),
ランダムアクセス・末尾追加 は o(n)
 使い道: ランダムアクセスがなく,
先頭追加を主とする時
head/tail を多用する時
immutable.List … ::(Cons) & Nil
scala> val x = scala.collection.immutable.Traversable(1, 2, 3)
x: scala.collection.immutable.Traversable[Int] = List(1, 2, 3)
scala> val x = scala.collection.immutable.List(1, 2, 3)
x: List[Int] = List(1, 2, 3)
scala> val x = 1 :: 2 :: 3 :: Nil
x: List[Int] = List(1, 2, 3)
実体はこっ
ち
abstract
Nil
Cons
Cons
head tail
listmatch{
caseNil=>
...
casehead::tail=>
...
}
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 24
 唯一遅延評価される Collection
 無限リスト
 遅延評価していること以外はほぼ List
 head・tail・先頭追加 が o(1)
 toList, fold 等のタイミングで評価される
immutable.Stream
scala> val x = scala.collection.immutable.Stream.from(0)
x: scala.collection.immutable.Stream[Int] = Stream(0, ?)
scala> x.take(3).toList
res14: List[Int] = List(0, 1, 2)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 25
 FIFO そのもの
 FIFO で必要な操作は全て均し o(1)
 使い道: FIFO を
immutable で使いたい時
 immutable.Stack(LIFO)はdeprecated
なのでimmutable.Listを使う
immutable.Queue
Nil
Nil
PurelyFunctionalDataStructures Search
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 26
 値が変わらないこと, immutableであることが保証されている
→ 部分データを使いまわせる(Data sharing)
(補足) immutable と関数型データ構造
Nillist0
list1
※ Persistent data structure ※ immutable ≠ readonly
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 27
 値が変わらないこと, immutableであることが保証されている
→ 部分データを使いまわせる(Data sharing)
(補足) immutable と関数型データ構造
vector0 vector1
FunctionalProgramminginScala/Scala関数型デザイン&プログラミング Search
※ Persistent data structure ※ immutable ≠ readonly
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 28
Trait
Class バッファトレイト
Wrapper的な
ArrayBuffer
mutable
デフォルト実
装
※apply の実装により, Trait であってもデフォルト実装の Collection としての初期化が可能
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 29
 Set, Map
 HashSet, HashMap
 Buffer
 ArrayBuffer
 ListBuffer
 Seq, LinearSeq
 Queue/Stack
 Array
Pick up!
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 30
 immutable と実装が異なり
単純な Hash (chain)
 検索・追加・削除 が o(1)
 immutable版より定数が小さい
 Set, Map のデフォルト実装
 使い道: 少しでも高速な Set, Map を使いたい時
データの傾向により OpenHashMap と使い分け
mutable.{HashSet, HashMap}
scala> val x = scala.collection.mutable.HashSet(1, 2, 3)
x: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3)
≒ java.util.{HashSet, HashMap}
add(8)
0 1 2 3 4 5 6
hash(8)=3
- - - -
- - -
1 5 3
-
8
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 31
 immutable と実装が異なり
単純な Hash (chain)
 検索・追加・削除 が o(1)
 immutable版より定数が小さい
 Set, Map のデフォルト実装
 使い道: 少しでも高速な Set, Map を使いたい時
データの傾向により OpenHashMap と使い分け
mutable.{HashSet, HashMap}
scala> val x = scala.collection.mutable.HashSet(1, 2, 3)
x: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3)
≒ java.util.{HashSet, HashMap}
0 1 2 3 4 5 6
- - 1 5 - 3 -
hash(8)=3
hash’(8)=4
Conflict!
OK!
8
add(8)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 32
 内部に配列を保持
 サンプルコードでよく使われるが…
 殆どの場合 immutable.List に負ける残念な子
 存在意義は…
 ないわけではない
 末尾追加とランダムアクセスが必要な場合に活躍
 末尾追加した後に toList をしない場合に活躍
mutable.ArrayBuffer
≒ java.util.ArrayList
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 33
 内部にリストを保持
 サンプルコードでよく使われるが…
 殆どの場合 immutable.List に負ける残念な子
 存在意義は…
 ないわけではない
 先頭追加 と 末尾追加 を両方用いる場合には活躍
(末尾追加のみは 先頭追加 + reverse でok)
mutable.ListBuffer
≒ java.util.LinkedList (←は双方向, ListBufferは単方向リスト)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 34
 FIFO/LIFO そのもの
 immutable版と比べ素直な実装
 FIFO/LIFO で必要な操作は全て o(1)
 immutable版より定数が小さい
 使い道: 少しでも速い FIFO/LIFO を使いたい時
mutable.{Queue, Stack}
scala> val x = scala.collection.mutable.Queue(1, 2, 3)
x: scala.collection.mutable.Queue[Int] = Queue(1, 2, 3)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 35
 実体は Java の配列
 mutable です!!!
 ランダムアクセス・更新 が o(1)
 標準ライブラリの†闇の力†によって他のコレクションと遜色なく扱える
 使い道: 要素の追加がなく, ランダムアクセスをメインに行う時
Array
※ver 2.8以前ほどではない
≒ Javaの配列
scala> val x = Array(1, 2, 3)
x: Array[Int] = Array(1, 2, 3)
0 1 2 3 4 5 6
4 -2 1 5 -1 3 3
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 36
適切なCollectionを見つけてくれる凄いやつだよ
https://gist.github.com/amaya382/84c9d15b634dcbf53ea4ef0e46d31da1
※最新版はGistを見てください
操作編
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 37
適切にCollection操作できていますか?
 Index-based (Random access)
 for { i <- 1 to 10 } { collection(i) }
 Traversal-based (Higher-order function)
 map, filter, fold, foreach, …
 Task-based
 再帰
Scala での Collection へのアクセス
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 39※勝手に分類&命名
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 40
 Scala ではイマイチ
 「計算にインデックスの値が必要な時」, 「不規則なアクセスをする時」に使いま
しょう
zipWithIndex も手段の一つ
(= コレクションを舐めるような操作には使わない)
 Array, Vector, ArrayBuffer, …
 以上!w
Index-based
Iteratorの十八番
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 41
 scala.collection の醍醐味
 色々なアクセスパターンが高階関数として提供されている(map, filter, …)
 for式も実はこれ
 for式は自動的に filter/withFilter/map/flatMap/foreach に展開
 filter等はwhileループや再帰で実装
 (末尾)再帰はwhileループに展開
Traversal-based
※展開イメージ
コンパイラに
おまかせあれ
for { i <- 1 to 10 } { println(i) }
(1 to 10).foreach { i => println(i) }
{
var i = 1
while (i <= 10) { println(i); i += 1 }
}
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 42
 scala.collection の醍醐味(その2)
 特に immutable.List との相性が◎
 Cons によるパターンマッチ(::, +:)
 Traversal-based より自由度高め. 使い分けはケースバイケース
 必ず 末尾再帰(!) にしましょう
 最適化されてwhileループに展開されます(= stack safe, 関数呼出コストナシ)
 @annotation.tailrec をお忘れず(末尾再帰でないとコンパイルエラー)
Task-based
@annotation.tailrec
def sum(seq: Seq[Int], acc: Int = 0): Int = seq match {
case Nil => acc
case h +: t => sum(t, acc + h)
}
sum(1 to 100) //5050
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 43
Task-based(cont.)
※Intellij IDEA
もう一歩踏み込むためのTips編
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 44
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 45
 Simpler chain is BETTER!!!
メソッドチェーンとの良い付き合い方
(1to10).filter(_%2==0).length
(1to10).count(_%2==0)
(1to10).foldLeft(true)((x,y)=>x&&y%2==0)
(1to10).forall(_%2==0)
Useless intermediate object
Complex
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 46
なぜ汎用性を捨ててまでシンプルなchainを使うのか?
可読性
実行速度
コレクションメソッドを適切に選択して使う
数は多いがIDEならサジェストしてくれることも
Searching と Filtering を意識する(e.g. exists(_==x)/ contains(x))
メソッドチェーンとの良い付き合い方(cont.)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 47
 なぜ遅延評価?
 例えば, list.map(...).filter(...).map(...).take(...)
 前→後 一つ一つ順番に評価する必要がある
…けどまとめたらもっと最適な評価方法があるのでは?
 そこで遅延評価
 Haskell, C#(LINQ) などではコレクション操作は遅延評価がデフォルト
 Scala のコレクションは正格評価…だが view を使うと遅延評価できる!
 Stream 以外で使える!
 モジュール性を維持したまま遅延評価の恩恵が受けられる!
遅延評価
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 48
Example
 take による中間コレクション生成コスト踏み倒し
 map による中間コレクション生成コスト踏み倒し
Streamではない遅延評価としてのview
val words = Array.fill(1000000)("しんかんせんえんせんかんし")
words.take(500000).find(word => word == word.reverse)
words.view.take(500000).find(word => word == word.reverse)
(1 to 1000000).map(_ + 1).take(1)
(1 to 1000000).view.map(_ + 1).take(1).force
(1 to 1000000).map(_ + 1).map(_ * 2).map(_ + 1)
(1 to 1000000).view.map(_ + 1).map(_ * 2).map(_ + 1).force
※手動でcompose可能だがモジュール性が失われる
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 49
 withFilter
 中間オブジェクトを生成しないすごいやつだよ
 直後が
withFilter
map
flatMap
foreach
に限定される
 (1 to 5).withFilter(_%2 == 0)
:FilterMonadic[Int,IndexedSeq[Int]]
遅延評価の親戚(1)
(1 to 5).filter { i =>
println(s"filter $i")
i % 2 == 0
}.map { i =>
println(s"map $i")
i * 2
}
(1 to 5).withFilter { i =>
println(s"filter $i")
i % 2 == 0
}.map { i =>
println(s"map $i")
i * 2
}
filter 1
filter 2
filter 3
filter 4
filter 5
map 2
map 4
filter 1
filter 2
map 2
filter 3
filter 4
map 4
filter 5
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 50
 {Tuple2, Tuple3}#zipped
 zip処理とその後の処理を一気に実行
遅延評価の親戚(2)
list0.zip(list1).map(p =>p._1 + p._2)
(list0, list1).zipped.map(_ +_)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 51
 list.length
 for{ i <- 1 to 10 } { list(i) }
 def f(l: List[Int]) = ...
 var hm = mutable.HashMap(0, 1, 2)
 import scala.collection.JavaConversions._
 breakOut
アンチパターンと愉快な仲間たち(別名: 時間調整)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 52
Q list.length
Q for{ i <- 1 to 10 } { list(i) }
A Collection の大きさが必要となる時・ランダムアクセスが必要となる時は
IndexedSeq を使う(IndexedSeq 以外でも高速な場合も有)
アンチパターンと愉快な仲間たち(1)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 53
Q def f(l: List[Int]) = ...
A 条件にあった class/trait を指定する
A def f(l: Seq[Int]) = ...
アンチパターンと愉快な仲間たち(2)
順序付きCollectionでさえあれば良い時
defng(seq:Seq[Int],acc:Int):Int=seqmatch{
caseNil=>acc
casehead::tail=>ng(tail,acc+head)
}
パターンマッチに注
意!
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 54
Q var hm = mutable.HashMap(0, 1, 2)
A .
アンチパターンと愉快な仲間たち(3)
要素\全体 var val
mutable
immutable
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 55
アンチパターンと愉快な仲間たち(4)
Q import scala.collection.JavaConversions._
A import scala.collection.JavaConverters._
A 明示的に変換しましょう
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 56
 breakOut とは
…の前にCollectionの変換したいときありますよね?
 map(...) のシグネチャはどうなっている?
アンチパターンと愉快な仲間たち(5)
defmap[B,That](f:A=>B)(implicitbf:CanBuildFrom[List[A],B,That]):That
defbreakOut[From,T,To](implicitb:CanBuildFrom[Nothing,T,To]):CanBuildFrom[From,T,To]
List(1, 2, 3).map(_ + 1)(collection.breakOut): Set[Int]
defmap[B,That](f:A=>B)(implicitbf:CanBuildFrom[Repr,B,That]):That
List(1, 2, 3).map(_ + 1)
(List)
(Traversable)
(List)
(Traversable)
2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 57
 結局何なん
 普段は…
暗黙的に決定されるBuilderを使ってmap等の処理が行われる
 breakOutを明示的に渡すと…
変換先の型が推論される
推論された型のBuilderを使ってmap等の処理が行われる
toSet等する必要がなくなる
 結論: 型推論isつよい
アンチパターンと愉快な仲間たち(5)(cont.)
Thank you for listening!
-References-
Scala Documentation (http://docs.scala-lang.org/)
ひしだま’s技術メモページ (http://www.ne.jp/asahi/hishidama/home/tech/scala/)
Scala Collections Tips and Tricks (https://pavelfatin.com/scala-collections-tips-and-tricks/)

Contenu connexe

Similaire à scala.collection 再入門 (改)

Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアルK Yamaguchi
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Etsuji Nakai
 
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門Teng Tokoro
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼうxenophobia__
 
Scalaを触ってみた
Scalaを触ってみたScalaを触ってみた
Scalaを触ってみたNemoto Yusuke
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
Scala勉強会
Scala勉強会Scala勉強会
Scala勉強会omi end
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
Material
MaterialMaterial
Material_TUNE_
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語ScalaTanUkkii
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターsohta
 
Programming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 CollectionsProgramming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 CollectionsJoongjin Bae
 

Similaire à scala.collection 再入門 (改) (20)

Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Collectionを使いこなす
Collectionを使いこなすCollectionを使いこなす
Collectionを使いこなす
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
 
Scalaを触ってみた
Scalaを触ってみたScalaを触ってみた
Scalaを触ってみた
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
pi-6. 繰り返し
pi-6. 繰り返しpi-6. 繰り返し
pi-6. 繰り返し
 
Scala勉強会
Scala勉強会Scala勉強会
Scala勉強会
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Material
MaterialMaterial
Material
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
 
Programming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 CollectionsProgramming in Scala Chapter 17 Collections
Programming in Scala Chapter 17 Collections
 

Plus de Ryuichi ITO

ゼロから始めるScala文法
ゼロから始めるScala文法ゼロから始めるScala文法
ゼロから始めるScala文法Ryuichi ITO
 
ゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクトゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクトRyuichi ITO
 
Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.Ryuichi ITO
 
サクサクアンドロイド
サクサクアンドロイドサクサクアンドロイド
サクサクアンドロイドRyuichi ITO
 

Plus de Ryuichi ITO (7)

ゼロから始めるScala文法
ゼロから始めるScala文法ゼロから始めるScala文法
ゼロから始めるScala文法
 
ゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクトゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクト
 
Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.
 
OUCC LT会2
OUCC LT会2OUCC LT会2
OUCC LT会2
 
サクサクアンドロイド
サクサクアンドロイドサクサクアンドロイド
サクサクアンドロイド
 
getstartedc#_2
getstartedc#_2getstartedc#_2
getstartedc#_2
 
getstartedc#_1
getstartedc#_1getstartedc#_1
getstartedc#_1
 

scala.collection 再入門 (改)

  • 2.  ITO Ryuichi(@amaya382)  大学院でGraphProcessingEngineとかNLPとか  Scalaっぽいこと  Scala関西Summitお手伝い組  Functional Programming in Scala読書会(次回は10/30)  Scala(入門レベル)を薄い技術書に書きまとめたい…夏コミ(?) tags: scala,c#,カイオーガ,きんモザ,ボカロ,splatoon,μ's 誰 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 2
  • 8. 💪 Scalaにおける 💪 💪 アルゴリズムとデータ構造力を鍛える 💪
  • 9.  種類編  scala.collection を Traversable から辿ってみる  操作編  for式?メソッドチェーン? 色々な操作方法とその仕組み  もう一歩踏み込むためのTips編  メソッドチェーンとの良い付き合い方  遅延評価  アンチパターンと愉快な仲間たち Contents 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 9
  • 10. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 10  コレクションメソッドの細かい話  scala.collection.parallel  Gen~  Par~  詳しい実装の話  ~Like  その他実用性が低そうな部分  モナモナしません 今回やらないこと
  • 11. 種類編 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 11
  • 13. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 13 Trait Class Array Seq List Range e.g. 1 to 10 http://docs.scala-lang.org/resources/images/collections.immutable.png
  • 14. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 14 Trait Class http://docs.scala-lang.org/resources/images/collections.mutable.png 多い どれ使えばいいの
  • 15. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 15 Trait Class 探索可能トレイト foreach できる 繰り返し可能トレイト Iterator を使って foreach できる 集合トレイト ユニークな値の集ま り 辞書トレイト key-value な 値の集まり ソート 済! ソート 済! 順序付きトレイ ト インデックスで アクセス可能 線形トレイト ポインタで 繋がれてる 索引済みトレイト インデックスによる ランダムアクセスに強 い List List HashSet HashMap Vector List List immutable(デフォルト) ※apply の実装により, Trait であってもデフォルト実装の Collection としての初期化が可能 デフォルト実 装
  • 16. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 16  Set, Map  HashSet, HashMap  TreeSet, TreeMap  IndexedSeq  Range  Vector  LinearSeq  List  Stream  Queue  Array (後ほど) Pick up!
  • 17. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 17  Iterator  データ群を舐めるための抽象的なデータ構造・手法  Collection が内部的に用いる(has-a)  Collection ごとに適切なデータの舐め方を実装する  e.g. List => head :: tail  next() / hasNext()  最終的には NoSuchElementException … 終端  Iterable  Iterator を提供できる Collection を表す Trait  全ての Scala の Collection が継承している(is-a) (補足) Iterator / Iterable scala> val iter = Iterator(0, 1, 2) iter: Iterator[Int] = non-empty iterator scala> iter.foreach(println) 0 1 2 scala> iter.foreach(println) scala> scala> val list = List(1, 2, 3) list: List[Int] = List(1, 2, 3) scala> list.iterator.foreach(println) 1 2 3 scala> list.iterator.foreach(println) 1 2 3 保有データをIteratorの形でコピー 状態(ポインタ)を持つ ポインタが終端まで進ん だ ※foreach等には 直接は利用されないことも
  • 18. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 18  Map ≒ Set の値を key に, 加えて value をポインタとして保持  ベースとなるデータ構造はほとんど等しい (補足) Set と Map イエロー, ピンク, グリーン,星空凛 小泉花陽 矢澤にこ keys values Set Map
  • 19. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 19  Trie(32分木) + Hash  検索・追加・削除 が 実質 o(1)  どの操作も速い  Set, Map のデフォルト実装  使い道: 重複のない集合(辞書)を immutable で使いたい時 immutable.{HashSet, HashMap} scala> val x = scala.collection.immutable.HashSet(1, 2, 3) x: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3) ※Map[整数, _] に特化した IntMap, LongMap もあるよ 32 32 32 1024 Hash値で 振り分け
  • 20. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 20  赤黒木  検索・追加・削除 が o(logn)  どの操作もそれなりに速い  ソート済み  SortedSet, SortedMapのデフォルト実装  使い道: 重複のない集合(辞書)を ソート済みで扱いたい時 最悪計算量を重視する時 immutable.{TreeSet, TreeMap} scala> val x = scala.collection.immutable.TreeSet(1, 2, 3) x: scala.collection.immutable.TreeSet[Int] = TreeSet(1, 2, 3) Nil Nil Nil Nil Nil Nil Nil Nil Nil
  • 21. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 21  範囲を表現しているだけ  head・tail・ランダムアクセス が o(1)  値を追加するようなことはできない  to, until, by, 負値(逆順)  使い道: 範囲の決められた値のコレクションを扱う時 e.g. ループ用のインデックス immutable.Range scala> val x = scala.collection.immutable.Range(1, 5, 2) x: scala.collection.immutable.Range = Range 1 until 5 by 2 scala> val x = 1 until 5 by 2 x: scala.collection.immutable.Range = Range 1 until 5 by 2 ※注意: ver 2.8より前はチェーン先が遅延評価, 以降は正格評価 1 until 5 1, 2, 3, 4 5 to 1 by -2 5, 3, 1
  • 22. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 22  32分木  head・tail・ランダムアクセス・更新 ・先頭追加・末尾追加・length が 実質 o(1)  カタログスペック最強 … だが定数大きめ  ランダムアクセスに強く, その他もそれなり  IndexedSeq のデフォルト実装 Range のデフォルト変換先  使い道: ランダムアクセスを中心に 色々な操作をする時 immutable.Vector scala> val x = scala.collection.immutable.Vector(1, 2, 3) x: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> val x = scala.collection.immutable.IndexedSeq(1, 2, 3) x: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3) ※java.util.Vector とは関係ありません!!! 32 32 32 1024
  • 23. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 23  単方向連結リスト. 再帰と相性◎  head・tail・先頭追加 が o(1), ランダムアクセス・末尾追加 は o(n)  使い道: ランダムアクセスがなく, 先頭追加を主とする時 head/tail を多用する時 immutable.List … ::(Cons) & Nil scala> val x = scala.collection.immutable.Traversable(1, 2, 3) x: scala.collection.immutable.Traversable[Int] = List(1, 2, 3) scala> val x = scala.collection.immutable.List(1, 2, 3) x: List[Int] = List(1, 2, 3) scala> val x = 1 :: 2 :: 3 :: Nil x: List[Int] = List(1, 2, 3) 実体はこっ ち abstract Nil Cons Cons head tail listmatch{ caseNil=> ... casehead::tail=> ... }
  • 24. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 24  唯一遅延評価される Collection  無限リスト  遅延評価していること以外はほぼ List  head・tail・先頭追加 が o(1)  toList, fold 等のタイミングで評価される immutable.Stream scala> val x = scala.collection.immutable.Stream.from(0) x: scala.collection.immutable.Stream[Int] = Stream(0, ?) scala> x.take(3).toList res14: List[Int] = List(0, 1, 2)
  • 25. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 25  FIFO そのもの  FIFO で必要な操作は全て均し o(1)  使い道: FIFO を immutable で使いたい時  immutable.Stack(LIFO)はdeprecated なのでimmutable.Listを使う immutable.Queue Nil Nil PurelyFunctionalDataStructures Search
  • 26. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 26  値が変わらないこと, immutableであることが保証されている → 部分データを使いまわせる(Data sharing) (補足) immutable と関数型データ構造 Nillist0 list1 ※ Persistent data structure ※ immutable ≠ readonly
  • 27. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 27  値が変わらないこと, immutableであることが保証されている → 部分データを使いまわせる(Data sharing) (補足) immutable と関数型データ構造 vector0 vector1 FunctionalProgramminginScala/Scala関数型デザイン&プログラミング Search ※ Persistent data structure ※ immutable ≠ readonly
  • 28. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 28 Trait Class バッファトレイト Wrapper的な ArrayBuffer mutable デフォルト実 装 ※apply の実装により, Trait であってもデフォルト実装の Collection としての初期化が可能
  • 29. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 29  Set, Map  HashSet, HashMap  Buffer  ArrayBuffer  ListBuffer  Seq, LinearSeq  Queue/Stack  Array Pick up!
  • 30. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 30  immutable と実装が異なり 単純な Hash (chain)  検索・追加・削除 が o(1)  immutable版より定数が小さい  Set, Map のデフォルト実装  使い道: 少しでも高速な Set, Map を使いたい時 データの傾向により OpenHashMap と使い分け mutable.{HashSet, HashMap} scala> val x = scala.collection.mutable.HashSet(1, 2, 3) x: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3) ≒ java.util.{HashSet, HashMap} add(8) 0 1 2 3 4 5 6 hash(8)=3 - - - - - - - 1 5 3 - 8
  • 31. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 31  immutable と実装が異なり 単純な Hash (chain)  検索・追加・削除 が o(1)  immutable版より定数が小さい  Set, Map のデフォルト実装  使い道: 少しでも高速な Set, Map を使いたい時 データの傾向により OpenHashMap と使い分け mutable.{HashSet, HashMap} scala> val x = scala.collection.mutable.HashSet(1, 2, 3) x: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3) ≒ java.util.{HashSet, HashMap} 0 1 2 3 4 5 6 - - 1 5 - 3 - hash(8)=3 hash’(8)=4 Conflict! OK! 8 add(8)
  • 32. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 32  内部に配列を保持  サンプルコードでよく使われるが…  殆どの場合 immutable.List に負ける残念な子  存在意義は…  ないわけではない  末尾追加とランダムアクセスが必要な場合に活躍  末尾追加した後に toList をしない場合に活躍 mutable.ArrayBuffer ≒ java.util.ArrayList
  • 33. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 33  内部にリストを保持  サンプルコードでよく使われるが…  殆どの場合 immutable.List に負ける残念な子  存在意義は…  ないわけではない  先頭追加 と 末尾追加 を両方用いる場合には活躍 (末尾追加のみは 先頭追加 + reverse でok) mutable.ListBuffer ≒ java.util.LinkedList (←は双方向, ListBufferは単方向リスト)
  • 34. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 34  FIFO/LIFO そのもの  immutable版と比べ素直な実装  FIFO/LIFO で必要な操作は全て o(1)  immutable版より定数が小さい  使い道: 少しでも速い FIFO/LIFO を使いたい時 mutable.{Queue, Stack} scala> val x = scala.collection.mutable.Queue(1, 2, 3) x: scala.collection.mutable.Queue[Int] = Queue(1, 2, 3)
  • 35. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 35  実体は Java の配列  mutable です!!!  ランダムアクセス・更新 が o(1)  標準ライブラリの†闇の力†によって他のコレクションと遜色なく扱える  使い道: 要素の追加がなく, ランダムアクセスをメインに行う時 Array ※ver 2.8以前ほどではない ≒ Javaの配列 scala> val x = Array(1, 2, 3) x: Array[Int] = Array(1, 2, 3) 0 1 2 3 4 5 6 4 -2 1 5 -1 3 3
  • 36. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 36 適切なCollectionを見つけてくれる凄いやつだよ https://gist.github.com/amaya382/84c9d15b634dcbf53ea4ef0e46d31da1 ※最新版はGistを見てください
  • 37. 操作編 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 37
  • 39.  Index-based (Random access)  for { i <- 1 to 10 } { collection(i) }  Traversal-based (Higher-order function)  map, filter, fold, foreach, …  Task-based  再帰 Scala での Collection へのアクセス 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 39※勝手に分類&命名
  • 40. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 40  Scala ではイマイチ  「計算にインデックスの値が必要な時」, 「不規則なアクセスをする時」に使いま しょう zipWithIndex も手段の一つ (= コレクションを舐めるような操作には使わない)  Array, Vector, ArrayBuffer, …  以上!w Index-based Iteratorの十八番
  • 41. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 41  scala.collection の醍醐味  色々なアクセスパターンが高階関数として提供されている(map, filter, …)  for式も実はこれ  for式は自動的に filter/withFilter/map/flatMap/foreach に展開  filter等はwhileループや再帰で実装  (末尾)再帰はwhileループに展開 Traversal-based ※展開イメージ コンパイラに おまかせあれ for { i <- 1 to 10 } { println(i) } (1 to 10).foreach { i => println(i) } { var i = 1 while (i <= 10) { println(i); i += 1 } }
  • 42. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 42  scala.collection の醍醐味(その2)  特に immutable.List との相性が◎  Cons によるパターンマッチ(::, +:)  Traversal-based より自由度高め. 使い分けはケースバイケース  必ず 末尾再帰(!) にしましょう  最適化されてwhileループに展開されます(= stack safe, 関数呼出コストナシ)  @annotation.tailrec をお忘れず(末尾再帰でないとコンパイルエラー) Task-based @annotation.tailrec def sum(seq: Seq[Int], acc: Int = 0): Int = seq match { case Nil => acc case h +: t => sum(t, acc + h) } sum(1 to 100) //5050
  • 43. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 43 Task-based(cont.) ※Intellij IDEA
  • 44. もう一歩踏み込むためのTips編 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 44
  • 45. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 45  Simpler chain is BETTER!!! メソッドチェーンとの良い付き合い方 (1to10).filter(_%2==0).length (1to10).count(_%2==0) (1to10).foldLeft(true)((x,y)=>x&&y%2==0) (1to10).forall(_%2==0) Useless intermediate object Complex
  • 46. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 46 なぜ汎用性を捨ててまでシンプルなchainを使うのか? 可読性 実行速度 コレクションメソッドを適切に選択して使う 数は多いがIDEならサジェストしてくれることも Searching と Filtering を意識する(e.g. exists(_==x)/ contains(x)) メソッドチェーンとの良い付き合い方(cont.)
  • 47. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 47  なぜ遅延評価?  例えば, list.map(...).filter(...).map(...).take(...)  前→後 一つ一つ順番に評価する必要がある …けどまとめたらもっと最適な評価方法があるのでは?  そこで遅延評価  Haskell, C#(LINQ) などではコレクション操作は遅延評価がデフォルト  Scala のコレクションは正格評価…だが view を使うと遅延評価できる!  Stream 以外で使える!  モジュール性を維持したまま遅延評価の恩恵が受けられる! 遅延評価
  • 48. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 48 Example  take による中間コレクション生成コスト踏み倒し  map による中間コレクション生成コスト踏み倒し Streamではない遅延評価としてのview val words = Array.fill(1000000)("しんかんせんえんせんかんし") words.take(500000).find(word => word == word.reverse) words.view.take(500000).find(word => word == word.reverse) (1 to 1000000).map(_ + 1).take(1) (1 to 1000000).view.map(_ + 1).take(1).force (1 to 1000000).map(_ + 1).map(_ * 2).map(_ + 1) (1 to 1000000).view.map(_ + 1).map(_ * 2).map(_ + 1).force ※手動でcompose可能だがモジュール性が失われる
  • 49. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 49  withFilter  中間オブジェクトを生成しないすごいやつだよ  直後が withFilter map flatMap foreach に限定される  (1 to 5).withFilter(_%2 == 0) :FilterMonadic[Int,IndexedSeq[Int]] 遅延評価の親戚(1) (1 to 5).filter { i => println(s"filter $i") i % 2 == 0 }.map { i => println(s"map $i") i * 2 } (1 to 5).withFilter { i => println(s"filter $i") i % 2 == 0 }.map { i => println(s"map $i") i * 2 } filter 1 filter 2 filter 3 filter 4 filter 5 map 2 map 4 filter 1 filter 2 map 2 filter 3 filter 4 map 4 filter 5
  • 50. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 50  {Tuple2, Tuple3}#zipped  zip処理とその後の処理を一気に実行 遅延評価の親戚(2) list0.zip(list1).map(p =>p._1 + p._2) (list0, list1).zipped.map(_ +_)
  • 51. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 51  list.length  for{ i <- 1 to 10 } { list(i) }  def f(l: List[Int]) = ...  var hm = mutable.HashMap(0, 1, 2)  import scala.collection.JavaConversions._  breakOut アンチパターンと愉快な仲間たち(別名: 時間調整)
  • 52. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 52 Q list.length Q for{ i <- 1 to 10 } { list(i) } A Collection の大きさが必要となる時・ランダムアクセスが必要となる時は IndexedSeq を使う(IndexedSeq 以外でも高速な場合も有) アンチパターンと愉快な仲間たち(1)
  • 53. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 53 Q def f(l: List[Int]) = ... A 条件にあった class/trait を指定する A def f(l: Seq[Int]) = ... アンチパターンと愉快な仲間たち(2) 順序付きCollectionでさえあれば良い時 defng(seq:Seq[Int],acc:Int):Int=seqmatch{ caseNil=>acc casehead::tail=>ng(tail,acc+head) } パターンマッチに注 意!
  • 54. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 54 Q var hm = mutable.HashMap(0, 1, 2) A . アンチパターンと愉快な仲間たち(3) 要素\全体 var val mutable immutable
  • 55. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 55 アンチパターンと愉快な仲間たち(4) Q import scala.collection.JavaConversions._ A import scala.collection.JavaConverters._ A 明示的に変換しましょう
  • 56. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 56  breakOut とは …の前にCollectionの変換したいときありますよね?  map(...) のシグネチャはどうなっている? アンチパターンと愉快な仲間たち(5) defmap[B,That](f:A=>B)(implicitbf:CanBuildFrom[List[A],B,That]):That defbreakOut[From,T,To](implicitb:CanBuildFrom[Nothing,T,To]):CanBuildFrom[From,T,To] List(1, 2, 3).map(_ + 1)(collection.breakOut): Set[Int] defmap[B,That](f:A=>B)(implicitbf:CanBuildFrom[Repr,B,That]):That List(1, 2, 3).map(_ + 1) (List) (Traversable) (List) (Traversable)
  • 57. 2 0 1 6 / 1 0 / 8scala.collection 再入門(改) 57  結局何なん  普段は… 暗黙的に決定されるBuilderを使ってmap等の処理が行われる  breakOutを明示的に渡すと… 変換先の型が推論される 推論された型のBuilderを使ってmap等の処理が行われる toSet等する必要がなくなる  結論: 型推論isつよい アンチパターンと愉快な仲間たち(5)(cont.)
  • 58. Thank you for listening! -References- Scala Documentation (http://docs.scala-lang.org/) ひしだま’s技術メモページ (http://www.ne.jp/asahi/hishidama/home/tech/scala/) Scala Collections Tips and Tricks (https://pavelfatin.com/scala-collections-tips-and-tricks/)

Notes de l'éditeur

  1. batched queue
  2. searching: 一つの解を求めるときに使う. 総当り前提ではない(e.g. find) filtering: 複数の回に絞り込むときに使う. 総当り前提(e.g. filter)