2016-02-28 73 views
3

我想轉換Map<String, NavigableMap<Long, Collection<String>>>列出 List<String>的Java 8 轉換地圖<字符串的NavigableMap <龍,收集<String> >>使用Java8

我寫了一些代碼,但卡住了中期一些地方。

userTopics.values().stream().map(
    new Function<NavigableMap<Long, Collection<String>>, Collection<String>>() { 
     @Override 
     public Collection<String> apply(NavigableMap<Long, Collection<String>> t) { 
      return null; //TODO 
     } 
    } 
); 

回答

4

只是flatMap that s**t

List<String> values = nestedMap.entrySet() 
     .stream() 
     .map(Map.Entry::getValue) 
     .flatMap(m -> m.entrySet().stream()) 
     .map(Map.Entry::getValue) 
     .flatMap(Collection::stream) 
     .collect(toList()); 

由於Holger指出,這是整潔:

List<String> values = nestedMap.values() 
     .stream() 
     .flatMap(m -> m.values().stream()) 
     .flatMap(Collection::stream) 
     .collect(toList()); 
+3

一個有趣的反模式,甚至兩次。 'entrySet().stream().map(Map.Entry :: getValue)'而不是流過期望的項目:'values()。stream()' – Holger

+1

@Holger是的,點了。 –

+1

@ cody123:它與'.map(entry - > entry.getValue())'相同,'entry'類型爲'Map.Entry'。當您還需要中間流操作中的鍵時,通過'entrySet()。stream()'流入條目並在需要值流時映射到值是正確的解決方案。但是,如果您只需要值*,則可以在第一個位置正確傳輸值。 – Holger

3

兩個flatMaps會做,平NavigableMap,然後平Collection內。

List<String> result = mapOfMaps.values() 
      .stream() 
      .flatMap(v -> v.values().stream()) 
      .flatMap(Collection::stream) 
      .collect(Collectors.toList()); 
相關問題