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
是一个可怕的构造。当嵌套了两个以上的数据结构(映射、集合、映射)时,应该重构代码以使用自定义对象。