文字列のリストがあり、リスト内の各キーの値を生成する機能があります。
この機能を使用して地図を作成します。 Googleコレクションでこれを行うことはできますか?
2012年7月26日の時点で、グアバマスターにはこれを行う2つの新しい方法が含まれています。リリース14.0にあるはずです。
Maps.asMap(Set<K>, Function<? super K, V>)
(およびSortedSet
およびNavigableSet
の2つのオーバーロード)を使用すると、Set
に加えてFunction
をMap
ここで、セット内の各キーの値は、そのキーに関数を適用した結果です。結果はビューなので、入力セットはコピーされず、Map
の結果はセットのように変化し、その逆も同様です。
Maps.toMap(Iterable<K>, Function<? super K, V>)
はIterable
を取り、それをImmutableMap
に熱心に変換します。反復可能な要素の個別の要素はキーで、値は各キーに関数を適用した結果です。
Maps.uniqueIndex(Iterable、Function) を使用します。
Map.values()が指定された順序で指定された要素である不変マップを返します。各キーは、対応する値で指定された関数を呼び出した結果です。 (javadoc)
例:
Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
public String apply(String from) {
// do stuff here
return result;
}});
編集:ショーンの権利と私は質問を誤解したことは完全に可能です。
元のリストがkeysである場合、 MapMaker.makeComputingMap
を介して、コンピューティングマップを使用できるように思えます。最初に入力リストを無視します。 編集:コメントに記載されているように、これはGuava 15.0で廃止され削除されました。CacheBuilder
をご覧ください代わりに 。
一方で、リストに含まれていないキーに対応する値を要求すると、nullを返すマップも提供されません。言い換えれば、これは適切かもしれませんnotが適切かもしれませんが、何をしようとしているかに応じて、検討する価値があります。 :)
neitherここでのアプローチがあなたにとって有用であるとあなたがコメントしない限り、私はこの答えをここに残します。その場合、私はそれを削除します。
元の答え
Guava を使用すると、 Maps.uniqueIndex
でこれを簡単に実行できます。
Map<String, String> map = Maps.uniqueIndex(list, keyProjection);
(古いGoogleコレクションリポジトリにMaps.uniqueIndex
が含まれているかどうかを確認していないため、Googleコレクションとは対照的に、特にGuavaについて言及しました。)
私はあなたを誤解しているか、他のポスターが持っています。 Maps.uniqueIndex()
はリストをマップキーにしたいことを理解していますが、値にマップするキーを作成します(まったく逆です)。
とにかく、あなたが要求している正確な機能を要求する 未解決のグアバ問題 があり、前の質問に対して そのような解決策を実装しました もあります。
Guava + Lambaの使用
Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());