![](/img/trans.png)
[英]Java 8 stream: how to Convert Map<String, List<Integer>> to Map<Integer, List<String>> using groupingBy(.)
[英]How to convert Stream<Map<Integer, String>> to map java 8
我在这里发布样本数据结构
我有一个列表List<Result> resultsList;
class Result {
String name;
Map<String,Integer> resultMap;
}
现在我想通过此列表流式传输并获取地图。
resultList.stream().filter(result->"xxx".equals(result.getName()))
.map(result->result.getResultMap);
它返回Stream<Map<String,Integer>>
但我只需要Map<String,Integer>
。
如何使用java 8流程获取它?
更新:
正如geneqew所说
这就是我的数据结构的外观
List<Result> resultsList;
Map<String, Integer> map1 = new HashMap<>();
map1.put("m1", 1);
Map<String, Integer> map2 = new HashMap<>();
map2.put("m2", 2);
Map<String, Integer> map3 = new HashMap<>();
map3.put("m3", 3);
results = Arrays.asList(
new Result("r1", map1),
new Result("r2", map2),
new Result("r3", map3)
);
我想根据name
检索单个地图。
for (Result result: resultsList)
{
if ('xxx'.equals(result.getName())
{
return result.getResultMap();
}
}
由于您要返回第一个Result
元素的结果映射以通过过滤器,因此可以使用findFirst()
获取它:
Optional<Map<String,Integer>> resultMap =
resultList.stream()
.filter(result->"xxx".equals(result.getName()))
.map(Result::getResultMap)
.findFirst();
您可以通过以下方式从Optional
提取Map
:
Map<String,Integer> resultMap =
resultList.stream()
.filter(result->"xxx".equals(result.getName()))
.map(Result::getResultMap)
.findFirst()
.orElse(null);
如果你只是在寻找一个项目:
resultList.stream()
.filter(result -> "xxx".equals(result.getName()))
.map(Result::getResultMap)
.findAny();
如果过滤器可以匹配多个项目,那么您需要展平然后toMap
其toMap
到:
resultList.stream()
.filter(result-> "xxx".equals(result.getName()))
.flatMap(result -> result.getResultMap().entrySet().stream())
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
如果可以有重复,那么使用合并功能来解决冲突:
resultList.stream()
.filter(result -> "xxx".equals(result.getName()))
.flatMap(result -> result.getResultMap().entrySet().stream())
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> l));
由于您只需要与结果名称匹配的地图,因此:
results.stream()
.filter(r-> r.getName().equals("r2"))
.map(r-> r.getResultMap())
.findFirst()
.orElse(null);
鉴于您有以下示例内容:
List<Result> results;
Map<String, Integer> map1 = new HashMap<>();
map1.put("m1", 1);
Map<String, Integer> map2 = new HashMap<>();
map2.put("m2", 2);
Map<String, Integer> map3 = new HashMap<>();
map3.put("m3", 3);
results = Arrays.asList(
new Result("r1", map1),
new Result("r2", map2),
new Result("r3", map3)
);
有点解释,你有一个流,因为你的流中的最后一个操作是一个地图; 假设在你的列表中可能有多个具有相同名称的结果,findFirst将返回第一个匹配,否则返回一个空的可选项; 最后orElse终止流,在空匹配上提供空值。
所以我想解释为什么你收到流而不是地图。 这样做的原因是因为在开始时你有List
with Result
对象,你按一些标准过滤(在你的情况下是"xxx".equals(result.getName())
)。
现在你可以得到零,一个或多个将通过这个标准的元素! Java不知道在编译时会传递多少元素,这就是你获得Stream的原因。
想象一下,如果您有两个具有相同名称“xxx”的Result对象,那么您将拥有两个映射。 问题是你想做什么? 如果您只获得其中一张地图,则会丢失信息。 如果你想获得所有这些,请尝试这样的事情:
List<Map<String,Integer>> listWithResultMaps = resultList.stream()
.filter(result->"xxx".equals(result.getName()))
.map(result->result.getResultMap())
.collect(Collectors.toList());
现在,在此listWithResultMaps
您可以处理因过滤器而拥有的所有地图。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.