繁体   English   中英

如何转换流 <Map<Integer, String> &gt;来映射java 8

[英]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();

如果过滤器可以匹配多个项目,那么您需要展平然后toMaptoMap到:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM