java:如何从Map <string,collection <map <string,string>&gt;&gt;中提取值

时间:2018-04-17 21:52:30

标签: java

我继承了一些代码,并且有一个定义为max_len

的地图

以下是存储在此地图中的一组示例值:

*max_len = 0;

我怎样才能得到A1.Item Number作为字符串列表?我打算将此转换为json并使用json路径。但由于我可以使用地图本身,是否有更简单的方法?

我正在使用java 8。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以像这样获得所需的结果:

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

这很可能被多次使用,在这种情况下,将逻辑封装到一个方法中是明智的:

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

然后简单地将对地图的引用和项目编号作为第二个参数传递,并检索一个值列表,其中地图输入键等于项目编号。

此外,非流方法将是:

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

答案 1 :(得分:0)

如果我理解正确,这就是你想要的:

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

但正如上面的评论所示,地图/收藏/地图嵌套是一个维护噩梦,你应该通过重构来摆脱它。