我在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;的val2
和SERVICE1
值但我不知道正确的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();
答案 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());