水底

ScalaとかC#とかネットワークとか

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-combinatorsxml のように外部モジュールに切り出されるようです

Migrationは ScalaFix

ScalaFix以外のMigrationツールも検討中らしい

まとめ

よさの塊. まだ実装途中なのでリリースが楽しみ.

リリースが待ちきれない, そんなあなたに (すぐに試せます)