Scala2.13からの新しいコレクションライブラリ
今更
もうProposalが出されてから暫く経っていますが今更軽く確認したのでメモ書き. 特に大した内容はないです. ちゃんと知りたい方は SCALA 2.13 COLLECTIONS REWORK や ソース を読んで下さい.
過去にScala2.8でも一度Scalaのコレクションライブラリは大きな変更が加えられています. その際に (確かに機能的なんですが) 分かりづらいと評判の CanBuildFrom
を中心とした仕組みが追加されました. しかしながら, その挙動は一見トリッキーで実装は無駄に巨大になってしまっているため, Scala2.13で新しいコレクションライブラリである Strawman に変更される予定です. 普通に(?) 利用している分にはAPIの変更はないため既存のコードはそのまま動くはずですが, breakOut
, view
や継承して自前のコレクションを作成している場合などには破壊的変更があるためコードの修正が必要 になります. 以下は個人的に気になった変更箇所のピックアップ.
速くなる
→うれしい
CanBuildFrom
が消える
コレクション内部の操作方法が変更され, map
等で生成されるコレクションの型を決定していた CanBuildFrom
が消えます. これでやっとIDEの補完が分かりやすくなりますね (今までのやつだと初心者が見たらわけわからんかったと思うの). 内部的にシンプルにしようとしているらしくソースをちら見した限りではかなり読みやすくなっていました. implicit
が大幅に減ってほぼ型クラス用にしか使われなくなっていたり.
ちなみに, CanBuildFrom
の代替として (?) FromIterable
で Concreteなコレクションの生成を行います (to
メソッドもこれを使うようになる). CanBuildFrom
と違ってExplicitな引数を使います.
CanBuildFrom
が消えたので当然 breakOut
も消える
以前は breakOut
でコレクション変換を端折ってちょっとパフォーマンスを上げるといったことができたのですが消えます. 代わりに view
を使うことになるようです. ちなみに view
の実装もシンプルになったとか.
val s: Seq[Int] = ... val set: Set[String] = s.map(_.toString)(collection.breakOut) // before val set = s.view.map(_.toString).to(Set) // after
collection.parallel
が標準ライブラリから外れる
parser-combinators
や xml
のように外部モジュールに切り出されるようです
Migrationは ScalaFix で
ScalaFix以外のMigrationツールも検討中らしい
まとめ
よさの塊. まだ実装途中なのでリリースが楽しみ.
リリースが待ちきれない, そんなあなたに (すぐに試せます)