Scala 2.8 コレクションAPI

Martin Odersky, Lex Spoon

2010年9月7日

訳: ると

原文: The Scala 2.8 Collections API

多くの人にとって、新しいコレクションフレームワークはScala 2.8の最も重要な変更点です。 以前からScalaはコレクションを備えていました(さらに言えば新しいフレームワークは従来のコレクションと大幅に互換性があります)。 しかし共通的で、均一で、全てを網羅するコレクション型のフレームワークは2.8でのみ提供されます。

一見するとコレクションの追加部分はわずかですが、 それがあなたのプログラミングスタイルに引き起す変化は重大です。 詳しく言えば多くの場合変化とは、プログラムの基本的なパーツがコレクションの要素ではなくコレクション全体であるかのように、高水準の部分で作業するようになるということです。 この新しいプログラミングスタイルにはある程度の慣れが必要です。 幸いなことに、新しいScalaのコレクションが持つ数々の素晴しい性質は慣れへの補助となります。 それは使いやすく、簡潔で、安全で、高速で、普遍的です。

使いやすい:
20から50の少ないボキャブラリがあれば、ほとんどのコレクションに関する問題は数ステップで解決できます。 入り組んだループ構造や再帰に頭を抱え込む必要はありません。 永続的コレクションと副作用の無い演算の結果、既存のコレクションを新しいデータでうっかり破損する心配がなくなります。 イテレータとコレクションの更新の干渉も取り除かれています。

簡潔:
いままで複数のループが必要だった処理も一言で達成できます。 関数的な処理を簡単な文法で表現でき、苦もなく組み合わせられるため、その成果物は専用の代数のように感じられます。

安全:
これは実感するには体験してみる必要があります。 Scalaのコレクションは静的に型付けされ関数的であるという特質を備えるため、 よく犯しがちな間違いのうち圧倒的多数はコンパイル時に捕捉されます。 その理由は以下の通りです: (1)コレクション全体に対する演算は多用されるためよくテストされている。 (2)コレクション全体に対する演算の利用により、入力と出力が関数のパラメータと結果として明示される。 (3)それらの明示的な入力と出力は静的な型チェックの対象である。 結論としては多くの誤用は型エラーとして現れます。 数百行のプログラムが一発で動くことも決して珍しくはありません。

高速:
コレクションに対する演算はライブラリ内で調整され最適化されています。 その結果、通常はコレクションを利用するととても効率的になります。 注意深く手でデータ構造と演算を調整すれば少しは良くなるかもしれませんが、 途中で最適でない実装の判断をして余計悪くしてしまうでしょう。 さらに、コレクションは現在マルチコア上で並列に動作するように改良中です。 並列コレクションは逐次的コレクションと同じ演算をサポートするため、 新しい演算を覚える必要もコードの書き替えも必要ありません。 parメソッドを呼ぶだけで逐次的コレクションを並列コレクションに変えられます。

普遍的:
コレクションはどの型でも、意味がある限り、同じ演算を提供します。 そのため極めて少ない演算のボキャブラリでも多くのことを達成できます。 例えば、文字列は概念的には文字の列です。よってScalaのコレクションでは文字列は列に対する演算を全てサポートします。 同様のことが配列にも成り立ちます。

例:
これはScalaのコレクションの利点の多くを示す1行のコードです

val (minors, adults) = people partition (_.age < 18)

この演算が何をするのかは一目瞭然です: これはpeopleのコレクションを歳によってminors(未成年)とadults(成年)に分けます。 partitionメソッドはコレクション型のルートであるTraversableLikeで定義されているため、このコードは配列を含むどんなコレクションについても動作します。 結果のminorsadultspeopleコレクションと同じ型になります。

このコードは従来のコレクションの処理で必要だった1つから3つのループ (中間結果を別の所にバッファする必要があるので配列の場合は3つのループ) よりもずっと簡潔です。 一度コレクションの基本的なボキャブラリを覚えてしまえばこのコードを書くのは明示的なループを書くよりもずっと簡単で安全であると気付くでしょう。 さらに、partitionメソッドはとても高速で、マルチコア上の並列コレクションではさらに速くなるでしょう。(並列コレクションは最新の開発ビルドに含まれており、Scala 2.9の一部としてリリースされる予定です)

以下のページではScala 2.8のコレクションクラスのAPIをユーザ視点から詳細に説明します。 全ての基本的なクラスとそこで定義されたメソッドのツアーへとあなたを誘います。

続いては: