Java 8 Streams API用于过滤Map条目



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

上工作
Map<String, List<Entry<Parameter, String>>>

其中Parameter是枚举类型,定义如下:

public enum Parameter {
    Param1,
    Param2,
    Param3
}

下面的代码显示了我如何初始化map结构-有效地在容器中放入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();

如果您只需要"val1"one_answers"val2"的值,您可以先使用getOrDefault获得相应的列表,然后对条目的键进行过滤,获得以Param1Param2为键的条目,最后再次应用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());

你也可能有兴趣看看Java的效率"双括号初始化"?

最新更新