2011-02-04 77 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)); 
給出這個問題在需要列表
相關問題