12

この質問はすでにここに投稿されています: guavaを使用してMap <String、String>をMap <Long、String>に変換する方法

CollinDの答えは適切だと思います。

変換とフィルタリングのためのGuavaのすべてのメソッドは、怠惰な結果を生成します...関数/述語は、オブジェクトが使用されるときに必要な場合にのみ適用されます。コピーは作成しません。ただし、そのため、変換によって。の要件を簡単に破ることができますSet

たとえば、Map<String, String>キーとして「1」と「01」の両方を含むがあるとします。これらは両方とも別個Stringのものであるため、 Map合法的に両方をキーとして含めることができます。Long.valueOf(String)ただし、を使用して変換する と、両方とも値にマップされます1。それらはもはや別個のキーではありません。マップのコピーを作成してエントリを追加しても、重複するキーがあるとそのキーの前のエントリが上書きされるため、これによって問題が発生することはありません。ただし、怠惰に変換さMapれた場合、一意のキーを適用する方法がないため、のコントラクトが破られますMap

これは本当ですが、実際には、次の理由でそれが行われない理由がわかりません。

  • キー変換が発生したときに、2つのキーが「マージ」されると、ランタイム例外が発生するか、フラグを渡して、新しく計算されたキーの複数の可能な値の任意の値を取得するようにGuavaに指示できます(フェイルファスト/フェイルセーフの可能性) )。

  • マルチマップを生成するMaps.transformKeysを持つことができます

そのようなことをすることで私が見ない欠点はありますか?

4

1 に答える 1

8

@CollinD が示唆するように、これを怠惰な方法で行う方法はありません。を実装するgetには、変換関数を使用してすべてのキーを変換する必要があります (重複が確実に検出されるようにするため)。

Function<K,NewK>ということで応募Map<K,V>はアウトです。

Function<NewK,K>マップに安全に適用できます。

V value = innerMap.get( fn.apply(newK) );

そのためのグアバの省略形は見当たりません-それは十分に役に立たないかもしれません. 次のようにすると、同様の結果が得られます。

Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn);
于 2012-12-21T16:40:48.797 に答える