java:如何从映射中提取值<;字符串、集合<;地图<;字符串,字符串>&燃气轮机&燃气轮机;
我继承了一些代码,有一个映射被定义为java:如何从映射中提取值<;字符串、集合<;地图<;字符串,字符串>&燃气轮机&燃气轮机;,java,Java,我继承了一些代码,有一个映射被定义为map 以下是存储在此映射中的一组示例值: { A1: [ {Item Number: "1234",Tax Code: "1"}, {Item Number: "2345",Tax Code: "2"}, {Item Number: "1234",Tax Code: "1"} ], B2: [ {Store Number: "111",Status: "2"},
map
以下是存储在此映射中的一组示例值:
{
A1: [
{Item Number: "1234",Tax Code: "1"},
{Item Number: "2345",Tax Code: "2"},
{Item Number: "1234",Tax Code: "1"}
],
B2: [
{Store Number: "111",Status: "2"},
{Store Number: "222",Status: "3"}
]
}
比如说,我如何获得A1.项目编号作为字符串列表?我计划将其转换为json并使用json路径。但既然地图本身对我来说是可用的,有没有更简单的方法
我正在使用Java8
谢谢 您可以像这样获得所需的结果:
String itemNumber = "1234";
List<String> result =
myMap.values()
.stream()
.flatMap(Collection::stream)
.map(Map::entrySet)
.flatMap(Collection::stream)
.filter(e -> e.getKey().equals(itemNumber))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
String itemNumber=“1234”;
列表结果=
myMap.values()
.stream()
.flatMap(集合::流)
.map(map::entrySet)
.flatMap(集合::流)
.filter(e->e.getKey().equals(itemNumber))
.map(map.Entry::getValue)
.collect(Collectors.toList());
这很可能会被多次使用,在这种情况下,明智的做法是将逻辑封装到如下方法中:
static List<String> getListOfValuesByItemNumber(
Map<String, Collection<Map<String, String>>> map,
String itemNumber){
return map.values()
.stream()
.flatMap(Collection::stream)
.map(Map::entrySet)
.flatMap(Collection::stream)
.filter(e -> e.getKey().equals(itemNumber))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
}
静态列表getListOfValuesByItemNumber(
地图,
字符串(项目编号){
返回map.values()
.stream()
.flatMap(集合::流)
.map(map::entrySet)
.flatMap(集合::流)
.filter(e->e.getKey().equals(itemNumber))
.map(map.Entry::getValue)
.collect(Collectors.toList());
}
然后,只需将对映射的引用和项目编号作为第二个参数传递,并检索回映射条目键等于项目编号的值列表
此外,非流方法将是:
static List<String> getListOfValuesByItemNumber(
Map<String, Collection<Map<String, String>>> map,
String itemNumber){
List<String> accumulator = new ArrayList<>();
map.values()
.forEach(collection ->
collection.forEach(m -> m.forEach((k, v) -> {
if(k.equals(itemNumber))
accumulator.add(v);
})));
return accumulator;
}
静态列表getListOfValuesByItemNumber(
地图,
字符串(项目编号){
列表累加器=新的ArrayList();
map.values()
.forEach(集合->
collection.forEach(m->m.forEach((k,v)->{
如果(k等于(项目编号))
添加(v);
})));
回流蓄能器;
}
如果我理解正确,这就是您想要的:
public static List<String> extractFieldValues(
Map<String, Collection<Map<String, String>>> horribleMess,
String fieldName) {
return horribleMess.values()
.stream()
.flatMap(Collection::stream)
.map(map -> map.get(fieldName))
.collect(Collectors.toList());
}
公共静态列表提取字段值(
地图恐怖,
字符串字段名){
返回horblemaness.values()
.stream()
.flatMap(集合::流)
.map(map->map.get(fieldName))
.collect(Collectors.toList());
}
但正如上面的一条评论所指出的,映射/集合/映射嵌套是一个维护噩梦,您应该通过重构来摆脱。好吧,您可以从获取与
A1
对应的值开始:myMap.get(“A1”)
。下一步是什么?嗨,oliver,我确实写了几行代码来获取映射列表,然后遍历项,然后获取所需键的值并添加到我想要的列表中。有人建议在Java8中使用“流”可能有一种更简单的方法。我不熟悉这个概念,我搜索了一下,没有得到一个清晰的理解。因此,我想在这里提问,你可能应该相应地更新/重写你的问题。i、 e.“这是我的迭代解决方案,但我不知道如何使用流。”Map
是一个可怕的构造。当嵌套了两个以上的数据结构(映射、集合、映射)时,应该重构代码以使用自定义对象。