この質問はすでにここに投稿されています: 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を持つことができます
そのようなことをすることで私が見ない欠点はありますか?