2016-09-14 40 views
1

我在Java中的以下容器,我需要在的Java 8流API過濾映射條目

Map<String, List<Entry<Parameter, String>>> 

在哪裏工作Parameter是定義枚舉類型如下:

public enum Parameter { 
    Param1, 
    Param2, 
    Param3 
} 

的下面的代碼顯示了我如何初始化映射結構 - 有效地將2行放入容器中。

Map<String, List<Entry<Parameter, String>>> map2 = new HashMap<String, List<Entry<Parameter, String>>>() {{ 
     put("SERVICE1", new ArrayList<Entry<Parameter, String>>(){{ 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param1,"val1")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param2,"val2")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param3,"val3")); 
     }}); 
     put("SERVICE2", new ArrayList<Entry<Parameter, String>>(){{ 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param1,"val4")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param2,"val5")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param3,"val6")); 
     }}); 
    }}; 

我需要使用java 8流API來找到「SERVICE1」的val1val2值,但我不知道正確的Java流過濾器和映射語法。

我能拿出最近的事情是下面的,但在頂級這隻過濾器,它返回一個列表的列表,而不是Parameter.Param1,"val1" & Parameter.Param2,"val3",我正在尋找從SERVICE1排列表。

List<List<Entry<Parameter, String>>> listOfLists = myMap.entrySet().stream() 
      .filter(next -> next.getKey().equals("SERVICE1")) 
      .map(Map.Entry::getValue) 
      .collect(Collectors.toList()); 
    listOfLists.size(); 

回答

3

如果你只需要「VAL1」和「VAL2」的價值觀,你可以先用getOrDefault得到相應的列表,然後在輸入鍵過濾得到與Param1Param2爲重點項目,最後再次應用地圖來獲取這些條目的值。

List<String> list = 
    myMap.getOrDefault("SERVICE1", Collections.emptyList()) 
     .stream() 
     .filter(e -> e.getKey() == Parameter.Param1 || e.getKey() == Parameter.Param2) 
     .map(Map.Entry::getValue) 
     .collect(Collectors.toList()); 

而且你可能有興趣看看Efficiency of Java "Double Brace Initialization"?

+0

不錯,但有沒有達到同樣的結果在目前的頂級濾波離開(未來的某種方式 - > next.getKey()等於( 「SERVICE1」)),我目前已經有或者總是要返回一個列表清單。我認爲我寫的代碼差不多在那裏,但是有一些方法可以返回列表中的第一個列表。 – johnco3

+2

@ johnco3嗯,是使用'flatMap'而不是'map',並以相同的方式過濾條目'.filter(next - > next.getKey()。equals(「SERVICE1」))。flatMap(e - > e .getValue()。stream()).filter(e - > e.getKey()== Parameter.Param1 || e.getKey()== Parameter.Param2).map(Map.Entry :: getValue).collect (...)'。但使用這種方法沒有好處,因爲您只有一個列表,因爲您對使用特定鍵的映射感興趣。 –

+2

...除非按鍵過濾可能導致多個列表,例如'next - > next.getKey()。startsWith(「SERVICE」)'。 –