Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何转换流<;地图<;整数,字符串>&燃气轮机;映射Java8_Java_Java 8_Java Stream - Fatal编程技术网

如何转换流<;地图<;整数,字符串>&燃气轮机;映射Java8

如何转换流<;地图<;整数,字符串>&燃气轮机;映射Java8,java,java-8,java-stream,Java,Java 8,Java Stream,这里我发布了示例数据结构 我有一个列表列表结果列表 class Result { String name; Map<String,Integer> resultMap; } 它返回Stream,但我只需要Map 如何使用Java8流获取它 更新: 正如geneqew所提到的那样 这就是我的数据结构的外观 List<Result> resultsList; Map<String, Integer> map1 = new HashMap&

这里我发布了示例数据结构

我有一个列表<代码>列表结果列表

class Result { 
    String name; 
    Map<String,Integer> resultMap; 
}
它返回
Stream
,但我只需要
Map

如何使用Java8流获取它

更新:

正如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)
);

由于您希望返回要通过过滤器的第一个
result
元素的结果映射,因此可以使用
findFirst()
获得它:


如果您只查找一个项目:

resultList.stream()
          .filter(result -> "xxx".equals(result.getName()))
          .map(Result::getResultMap)
          .findAny();
如果筛选器可以匹配多个项目,则需要展平,然后
toMap
it:

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));

所以我想解释一下为什么你收到的是流而不是地图。这是因为在开始时,您有
列表
结果
对象,您可以根据某些条件进行筛选(在您的示例中是
“xxx”.equals(Result.getName())

现在您可以得到零个结果,一个或多个元素将通过此标准!Java不知道在编译时会传递多少元素,这就是为什么会得到流

假设您有两个同名“xxx”的结果对象,那么您将有两个映射。问题是你想做什么?如果你只得到一张地图,你就会丢失信息。如果您想获得所有这些,请尝试以下方式:

        List<Map<String,Integer>> listWithResultMaps = resultList.stream()
                                                   .filter(result->"xxx".equals(result.getName()))
                                                   .map(result->result.getResultMap())
                                                   .collect(Collectors.toList());
List listwithresultmap=resultList.stream()
.filter(结果->“xxx”.equals(结果.getName()))
.map(结果->结果.getResultMap())
.collect(Collectors.toList());
现在,在这个
列表WithResultMaps
中,您可以处理作为筛选结果的所有映射


祝你好运

由于您只需要与结果名称匹配的映射,因此:

 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)
);
列出结果;
Map map1=新的HashMap();
map1.put(“m1”,1);
Map map2=新的HashMap();
地图2.put(“m2”,2);
Map map3=新的HashMap();
地图3.put(“m3”,3);
结果=Arrays.asList(
新结果(“r1”,map1),
新结果(“r2”,map2),
新结果(“r3”,map3)
);

解释一下,您得到了一个流,因为流中的最后一个操作是一个映射;假设列表中可能有多个同名结果,findFirst将返回第一个匹配项,否则返回一个空可选项;最后,orElse需要终止流,在空匹配中提供空值。

最简单的方法可能是,如果您发布了符合您要求的非流代码。请提供一个具体示例,并说明您希望输出的内容。通常情况下,流是处理每个元素的管道,直到到达最后一步。在这种情况下,OP为什么要使用列表而不是映射开始?只是澄清一下,这绝不是对答案的批评。@MadPhysica学家,你是指
映射而不是
列表
?我们不知道数据是从哪里来的。如果需要进行多个搜索,那么构建地图可能是值得的。谢谢。findAny()或findFirst()是我问题的答案。最后一个应该适用于所有情况,但您列出所有三种解决方案的原因是这个问题并不清楚。@nullpointer适用于所有情况,但当您可以与findAny短路时,为什么还要处理另一个“吨”元素。因此,如果OP只在一个项目之后,那么这就是使用
findAny
的动机,否则,他们可能正在寻找
toMap
方法。
findAny
对合并案例不起作用,是吗?我要重复一次,这确实带来了一种问题的感觉,即不清楚。这在你自己的回答中不是很明显吗?谢谢。findAny()或findFirst()是我问题的答案。谢谢。findAny()或findFirst()是我问题的答案。
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));
        List<Map<String,Integer>> listWithResultMaps = resultList.stream()
                                                   .filter(result->"xxx".equals(result.getName()))
                                                   .map(result->result.getResultMap())
                                                   .collect(Collectors.toList());
 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)
);