2011-02-04 95 views
11

我有一个带有字符串的地图,我想将它转换为一个带有“”作为关键值分隔符的字符串列表。是否有可能使用谷歌收藏?如何使用Google集合将地图<字符串,字符串>转换为列表<String>

,我想使用谷歌集合做

代码示例:

public static List<String> addLstOfSetEnvVariables(Map<String, String> env) 
{ 
    ArrayList<String> result = Lists.newArrayList(); 
    for (Entry<String, String> entry : env.entrySet()) 
    { 
     result.add(entry.getKey() + " " + entry.getValue()); 
    } 
    return result; 
} 

回答

16

在这里你去:

private static final Joiner JOINER = Joiner.on(' '); 
public List<String> mapToList(final Map<String, String> input){ 
    return Lists.newArrayList(
     Iterables.transform(
      input.entrySet(), new Function<Map.Entry<String, String>, String>(){ 
       @Override 
       public String apply(final Map.Entry<String, String> input){ 
        return JOINER.join(input.getKey(), input.getValue()); 
       } 
      })); 
} 

更新:优化代码。使用乔伊纳常数应该比String.concat()更快,现在我当然会用Java 8流做到这一点。不需要外部库。

public List<String> mapToList(final Map<String, String> input) { 
    return input.entrySet() 
       .stream() 
       .map(e -> new StringBuilder(
          e.getKey().length() 
            + e.getValue().length() 
            + 1 
        ).append(e.getKey()) 
         .append(' ') 
         .append(e.getValue()) 
         .toString() 
       ) 
       .collect(Collectors.toList()); 
} 
9

函数式编程是很酷,但在Java中往往增加了复杂性,你真的不应该增加(如Java不支持非常好),我会建议你使用一个简单的循环这更短,更高效且易于维护,并且不需要额外的库来学习。

public static List<String> mapToList(Map<String, String> env) { 
    List<String> result = new ArrayList<String>(); 
    for (Entry<String, String> entry : env.entrySet()) 
     result.add(entry.getKey() + " " + entry.getValue()); 
    return result; 
} 

一个简单的代码复杂度测试它计算所用符号的数量。即<({=:+ @ 不算靠近括号

plain loop 22 symbols. 
functional approach 30 symbols. 
+0

,我同意。但是,如果返回类型是可迭代的,则Guava的`Iterables.transform()`将是有利的,因为它只是原始集合的转换视图(即,只需要在客户端代码中迭代一次) – 2011-02-04 09:44:48

2

更多电流溶液

public static void main(final String[] args) 
{ 
    final Map<String, String> m = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3"); 
    final Collection<String> c = Maps.transformEntries(m, new Maps.EntryTransformer<String, String, String>() 
    { 
     @Override public String transformEntry(@Nullable final String key, @Nullable final String value) 
     { 
      return Joiner.on(' ').join(key, value); 
     } 
    }).values(); 
    System.out.println(c); 
} 

输出

[k1 v1, k2 v2, k3 v3] 
5

下面是使用Java 8流的功能性的方法:

List<String> kv = map.entrySet().stream() 
    .map(e -> e.getKey() + " " + e.getValue()) //or String.format if you prefer 
    .collect(Collectors.toList()); 

如果你不执着于功能性的风格,这里是明显的for循环更简洁的变种:

List<String> kv = new ArrayList<>(); 
map.forEach((k, v) -> kv.add(k + " " + v)); 
给出这个问题在需要列表
相关问题