私は実際にグーグルグアバライブラリのMultimap
クラスが好きです。これは、キーの複数の値を追加できるマップ型であるため、キーからある種のコレクションに効果的にマッピングされます。私が特に気に入っているのは関数で、Iterable
とキー関数をとり、を返します。Iterable
の要素を、それらの要素ごとに返す値でグループ化(またはインデックス付けまたはマップ)します。なぜGuava Multimap.values()はコレクションのコレクションではなくフラットなコレクションを返しますか?
少し奇妙なことは、Multimap.values()
がコレクションのコレクションではなくフラットなコレクションを返すことです。だから、インデックス関数が私に与えたグループ化は、一度値を取得すると失われます。私はMultimap.asMap()
を呼び出すことによってその問題を回避し、その上でvalues()を呼び出すことができます。
誰でも、なぜMultimap
がそのように振舞うのか理解できますか?
私は通常、マルチマップを使用しています。したがって、「問題」によって、私はドメインの問題を意味し、Multimap-APIの問題は意味しませんでした。私はAPIを批判していたように聞こえてはいけません。その背後にある哲学については、あまり理解していませんでした。ご回答有難うございます。 – nansen
@nansen:Multimapが2つの概念が重複していることを隠そうとしているようではありません(たとえば、キー()を繰り返し実行し、そのキーの値のコレクションを取得するために 'get(key) 'を実行できます)。理解するのは、マルチマップのすべての値を尋ねると、通常のマップと同様に、関連するキーは気にしないということだけです。それ以外の場合は 'Map>'として表示するライブビューを表示します。あなたは 'asMap'は何もコピーをしていないことを認識していますよね?同じデータを別の視点から見るだけなので、オーバーヘッドはごくわずかです。 –
私は、再利用性の重要な原則を表現しているので、この見方が気に入っています。 Alan Perlis氏は次のように述べています。「10個のデータ構造に対して10個の関数より100個の関数が1つのデータ構造で動作するほうがよい。" – nansen