web-dev-qa-db-ja.com

GoogleコレクションでList <String>をMap <String、String>に変換する方法は?

文字列のリストがあり、リスト内の各キーの値を生成する機能があります。

この機能を使用して地図を作成します。 Googleコレクションでこれを行うことはできますか?

51
oshai

2012年7月26日の時点で、グアバマスターにはこれを行う2つの新しい方法が含まれています。リリース14.0にあるはずです。

Maps.asMap(Set<K>, Function<? super K, V>)(およびSortedSetおよびNavigableSetの2つのオーバーロード)を使用すると、Setに加えてFunctionMapここで、セット内の各キーの値は、そのキーに関数を適用した結果です。結果はビューなので、入力セットはコピーされず、Mapの結果はセットのように変化し、その逆も同様です。

Maps.toMap(Iterable<K>, Function<? super K, V>)Iterableを取り、それをImmutableMapに熱心に変換します。反復可能な要素の個別の要素はキーで、値は各キーに関数を適用した結果です。

23
ColinD

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;
  }});
88
dogbane

編集:ショーンの権利と私は質問を誤解したことは完全に可能です。

元のリストが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について言及しました。)

15
Jon Skeet

私はあなたを誤解しているか、他のポスターが持っています。 Maps.uniqueIndex() はリストをマップキーにしたいことを理解していますが、値にマップするキーを作成します(まったく逆です)。

とにかく、あなたが要求している正確な機能を要求する 未解決のグアバ問題 があり、前の質問に対して そのような解決策を実装しました もあります。

13

Guava + Lambaの使用

 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
6
Carlos