как преобразовать список <string> в карту <string, string> с коллекциями google?

<p>у меня есть список строк, и у меня есть функция для генерации значения для каждого ключа в списке.</p><p>я хочу создать карту с помощью этой функции. могу ли я сделать это с коллекциями google?</p>

<p>по состоянию на 26.07.2012 мастер guava содержит два новых способа сделать это. они должны быть в выпуске 14.0.</p><p><code>maps.asmap(set<k>, function<? super k, v>)</code> (и две перегрузки для <code>sortedset</code> и <code>navigableset</code>) позволяет просматривать <code>set</code> плюс <code>function</code> как <code>map</code>, где значение для каждого ключа в наборе является результатом применения функции к этому ключу. результатом является представление, поэтому оно не копирует входной набор, и результат <code>map</code> изменится, как и набор, и наоборот.</p><p><code>maps.tomap(iterable<k>, function<? super k, v>)</code> берет <code>iterable</code> и охотно преобразует его в <code>immutablemap</code>, где различные элементы итерируемого являются ключами, а значения являются результатами применения функции к каждому ключу.</p>

<p>используйте <a href="https://github.com/google/guava/wiki/collectionutilitiesexplained#uniqueindex">maps.uniqueindex (iterable, function)</a> :</p><blockquote> <p>возвращает неизменную карту, для которой map.values () являются заданными элементами в указанном порядке, и каждый ключ является продуктом вызова предоставленной функции для ее соответствующего значения . <a href="http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/maps.html#uniqueindex(java.lang.iterable,%20com.google.common.base.function)">(из javadoc)</a> </p> </blockquote><p>пример:</p><pre><code>map<string,string> mappedroles = maps.uniqueindex(yourlist, new function<string,string>() { public string apply(string from) { // do stuff here return result; }}); </code></pre>

<p>правка: вполне возможно, что шон прав, и я неправильно понял вопрос.</p><p>если исходный список должен быть <em> ключами </em>, то похоже, что вы можете просто использовать карту вычислений, используя <a href="https://google.github.io/guava/releases/14.0/api/docs/com/google/common/collect/mapmaker.html#makecomputingmap(com.google.common.base.function)"><code>mapmaker.makecomputingmap</code></a> , и игнорировать список ввода для начала. <strong> редактировать: как отмечено в комментариях, теперь это устарело и удалено в guava 15.0. </strong> взгляните на <a href="https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/cache/cachebuilder.html"><code>cachebuilder</code></a> .</p><p>с другой стороны, это также не дает вам карту, которая будет возвращать ноль, если вы спросите ее о значении, соответствующем ключу, которого не было в списке для начала. это также не даст вам иными словами, это может <em> быть не </em> неуместным, но это стоит рассмотреть, в зависимости от того, что вы пытаетесь с этим делать. :)</p><p>я оставлю этот ответ здесь, если вы не прокомментируете, что <em> ни один </em> подход здесь не полезен для вас, и в этом случае я его удалю.</p><hr><p><strong> оригинальный ответ </strong></p><p>используя <a href="http://code.google.com/p/guava-libraries/">guava</a> вы можете сделать это довольно легко с помощью <a href="https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/maps.html#uniqueindex(java.lang.iterable,%20com.google.common.base.function)"><code>maps.uniqueindex</code></a> :</p><pre><code>map<string, string> map = maps.uniqueindex(list, keyprojection); </code></pre><p>(я упомянул guava специально, в отличие от коллекций google, так как я не проверял, содержит ли более старый репозиторий коллекций google <code>maps.uniqueindex</code>.)</p>

<p>либо я вас неправильно понял, либо другие постеры. я понимаю, что вы хотите, чтобы в вашем списке были ключи карты, а <a href="https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/maps.html#uniqueindex%28java.lang.iterable,%20com.google.common.base.function%29"><code>maps.uniqueindex()</code></a> создает ключи для сопоставления с вашими значениями (что совершенно противоположно).</p><p>в любом случае, существует <a href="http://code.google.com/p/guava-libraries/issues/detail?id=56">открытая проблема гуавы</a> , которая запрашивает точную функциональность, которую вы запрашиваете, и я также <a href="https://stackoverflow.com/questions/3869258/guava-setk-functionk-v-mapk-v/3870481#3870481">реализовал такое решение</a> для предыдущего вопроса.</p>

<p>использование гуавы + ламба</p><pre><code> map<string, yourcustomclass> map = maps.uniqueindex(yourlist, yourcustomclass -> yourcustomclass.getkey()); </code></pre>