2015-11-17 56 views
3

假設我有一組字符串的地圖爲整數值:
Map<HashSet<String>, Integer> map = new HashMap<>()使用Java 8 Stream API展平地圖並關聯值

例如,map是(我們假定沒有重複的字符串):

{x,y} -> 2 
{z}  -> 3 
{u,v,w} -> 4 

我怎樣才能得到Map<String, Integer>如下類型的,使用Java的8個流API的

x -> 2 
y -> 2 
z -> 3 
u -> 4 
v -> 4 
w -> 4 

它看起來像一個flatMap操作,但如何腠ld我將Integer值與每個String鍵相關聯?

回答

5

爲此,您可以創建中間Map.Entry對象是這樣的:

Map<String, Integer> result = map.entrySet().stream() 
    .<Entry<String, Integer>>flatMap(entry -> 
     entry.getKey() 
      .stream() 
      .map(s -> new AbstractMap.SimpleImmutableEntry<>(s, entry.getValue()))) 
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 

或者你可以使用你在你的項目中的任何其它對/元組的類型。我的自由StreamEx庫還支持更清潔的方式處理這種情況下

注(內部它與上面相同):

Map<String, Integer> result = EntryStream.of(map).flatMapKeys(Set::stream).toMap(); 

EntryStream類擴展Stream<Map.Entry>並提供額外幫助的方法,如flatMapKeystoMap