Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何转换列表<;字符串>;映射<;字符串,字符串>;谷歌收藏?_Java_List_Dictionary_Guava - Fatal编程技术网

Java 如何转换列表<;字符串>;映射<;字符串,字符串>;谷歌收藏?

Java 如何转换列表<;字符串>;映射<;字符串,字符串>;谷歌收藏?,java,list,dictionary,guava,Java,List,Dictionary,Guava,我有一个字符串列表,我有一个函数为列表中的每个键生成一个值 我想用这个函数创建一个地图。我能用Google collections做到这一点吗?编辑:肖恩完全有可能是对的,我误解了这个问题 如果原来的列表是要作为键的,那么听起来您可能只需要使用一个计算映射,via,然后忽略输入列表即可EDIT:如评论中所述,这一点在Guava 15.0中已被弃用并删除。请查看 另一方面,这也不会给您一个映射,如果您要求它提供一个与列表中不包含的键对应的值,该映射将返回null。它也不会给你任何好处,换句话说,这

我有一个字符串列表,我有一个函数为列表中的每个键生成一个值


我想用这个函数创建一个地图。我能用Google collections做到这一点吗?

编辑:肖恩完全有可能是对的,我误解了这个问题

如果原来的列表是要作为键的,那么听起来您可能只需要使用一个计算映射,via,然后忽略输入列表即可EDIT:如评论中所述,这一点在Guava 15.0中已被弃用并删除。请查看

另一方面,这也不会给您一个映射,如果您要求它提供一个与列表中不包含的键对应的值,该映射将返回null。它也不会给你任何好处,换句话说,这可能不太合适,但它值得考虑,这取决于你想用它做什么。:)

我将把这个答案留在这里,除非你评论说这里的两种方法对你都没有用处,在这种情况下,我将删除它


原始答案

使用以下工具,您可以非常轻松地做到这一点:

Map Map=Maps.uniqueIndex(列表,键投影);
(我特别提到了番石榴,而不是Google collections,因为我没有检查旧的Google collections存储库是否包含
地图。uniqueIndex

使用:

返回一个不可变的映射,其中 value()是中给定的元素 给定的顺序,每个键都是 调用提供的 函数的相应值

例如:

Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
  public String apply(String from) {
    // do stuff here
    return result;
  }});
Map-mappedRoles=Maps.uniqueIndex(yourList,new Function()){
公共字符串应用(字符串来自){
//在这里做事
返回结果;
}});

要么我误解了你,要么其他海报误解了你。我知道您希望列表是映射键,而创建映射到您的值的键(这正好相反)


无论如何,有一种方法要求您所要求的确切功能,我还有一个问题要回答。

自2012年7月26日起,番石榴大师提供了两种新方法。它们应该在14.0版中

Maps.asMap(集合,函数使用番石榴+Lambda

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

我假设您知道这一点,但是如果函数为原始列表中的任意两个元素生成的值可能相同,那么您需要使用
多重映射。index
生成一个
多重映射
,它可以为同一个键存储多个值。是的,我想您可能是对的。我在cas中编辑了关于计算映射的答案e这将适合OP,但我已经准备好完全删除答案。此解决方案的性能如何?我想将其用于大型对象列表中的50000+个元素。我目前使用两个单独的映射,它们存储相同的对象,但映射到不同的键。我想去掉这些映射并使用列表(因为键已经是对象的字段)。您的解决方案允许我从列表中自动生成地图。但代价是什么?@m_pGladiator我知道您的问题很老,但答案可能会引起其他人的兴趣…我想说,提供番石榴方法更多的是为了方便/可读性,而不是为了性能。如果您有疑问,请坚持手动制作或者使用卡尺之类的工具来测量各自的性能。OP说他们有“一个[功能]来为列表中的每个键生成值”.Maps.uniqueIndex为列表中的每个值生成键,这与OP要求的相反。因此,此答案和Sean的asnwer不正确,而ColinD的答案不正确。
makeComputingMap
已被弃用,并计划很快删除。@ripper234:谢谢,已添加到CacheBuilder的链接。我考虑在中添加一个链接我最初的评论是,但是从CacheBuilder中获取地图是否简单?如果lambda可用,您可以放弃guava并使用Java8流API。除非您是为Android<7.0开发的
 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());