Java標準ライブラリには、機能更新を伴う不変のセット、リストなどの機能データ構造がありますか?
10 に答える
pcollectionsプロジェクトを見てください:
PCollectionsは、Javaコレクションフレームワークの永続的で不変のアナログとして機能します。これには、Javaコレクションの対応するものと互換性のある、効率的でスレッドセーフ、汎用、不変、および永続的なスタック、マップ、ベクター、セット、およびバッグが含まれます。
永続的で不変のデータ型は、単純で、設計にやさしく、並行性にやさしく、場合によっては、可変のデータ型に代わる、時間とスペースの効率が高いものとしてますます高く評価されています。
Googleコレクションが接続されているのを見るのはいつでもいいことですが、いいえ、これはありません。私はそうするJavaライブラリを知りません。Googleの内部では、いくつかの機能的なリスト構造を実装しましたが、何を推測しますか?誰もそれらを使用しません。したがって、すぐにオープンソースになる可能性は低いです。
Scalaを探しているようですね。.classにコンパイルされるので、それで十分ですよね?
Scalaは必要ありません。コレクションを次の場所に渡すだけです。
java.util.Collections.unmodifiableCollection(/* Collection<? extends T> c */);
java.util.Collections.unmodifiableSet(Set s);
java.util.Collections.unmodifiableMap(Map m);
java.util.Collections.unmodifiableList(List l);
私は別のSOの質問からこれを見ました:
GoogleのImmutableSet
ドキュメントから:
変更可能な個別のコレクションのビューであるCollections.unmodizableSet(java.util.Set)とは異なり、このクラスのインスタンスには独自のプライベートデータが含まれており、変更されることはありません。このクラスは、パブリック静的ファイナルセット(「定数セット」)に便利であり、呼び出し元からクラスに提供されたセットの「防御コピー」を簡単に作成することもできます。
コメントを組み込むために編集されました。
不変のコレクションを「変更」するには、次の2つの方法があります。
「変更」を含むコピーを作成します
元のオブジェクトへの参照と変更の説明への参照で構成される、新しい別のオブジェクトを作成します。
Clojureは後者のアプローチを採用しているため、元のコレクションの兄弟を多数作成するのはかなり迅速になり、それぞれにわずかな修正を加えて、妥当なメモリ要件を設定します。しかし、ほとんどのJavaコードは最初のオプションを選択する傾向があります。
その価値のために、グーグルは機能的なスタイルのプログラミングをサポートするいくつかのコレクションを作成しました:http ://code.google.com/p/google-collections/しかし、私はそれらを詳細に調べていません。
これは古い質問ですが、少し調べてみると、FunctionalJavaの代替手段があることがわかります。
JavasLangは、Javaの宣言型プログラミングと機能データ構造のための興味深いライブラリのように見えます。
使いやすさとパフォーマンスの点でFunctionalJavaと比較していませんが、それについての指針を知りたいと思います。
文字列と数値は機能的に不変ですが、ほとんどのコレクションは不変ではありません(不変のコレクションは、追加、削除などで例外をスローします)。 その意味で最も近いですCopyOnWriteArrayList
。CopyOnWriteArraySet
機能的なスタイルでのコレクション操作に興味がある場合は、lambdajをご覧ください。
Googleコレクションをご覧ください。