Java 8 Streams API用于过滤Map条目

时间:2016-09-14 18:27:20

标签: collections java-8 java-stream

我在Java中有一个以下容器需要处理

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 streams api来查找来自&#34; val1&#34;的val2SERVICE1值但我不知道正确的java流过滤器和映射语法。

我能提出的最接近的事情是以下内容,但这只是在顶层过滤,它返回列表而不是Parameter.Param1,"val1"&amp;列表。我正在寻找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();

1 个答案:

答案 0 :(得分:3)

如果您只需要“val1”和“val2”值,则可以先使用getOrDefault获取相应的列表,然后过滤条目的键以获取Param1的条目或Param2作为键,最后再次应用map来获取这些条目的值。

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"?