我在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
"找到val1
和val2
值,但我不知道正确的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
获得相应的列表,然后对条目的键进行过滤,获得以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());
你也可能有兴趣看看Java的效率"双括号初始化"?