如何转换流<;地图<;整数,字符串>&燃气轮机;映射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)
);