【问题标题】:Java Iterate internal information in value of a Map <Key>Java 迭代 Map <Key> 值中的内部信息
【发布时间】:2021-05-15 07:39:59
【问题描述】:

我正在使用 MongoDB 和 Spring 进行练习,但我有以下两难境地;在数据库中,我有以下信息:

[
  {
 "menu":"querys",
 "optionsList":[
 {
    "options":[
       "0001",
       "0022",
       "0014",
       "0041",
       "0042",
       "0043"
     ]
   }
 ]
},{..},{...}
]

Java中对象的结构如下:

@Document(collection = "menu")
public class GetAllRules implements Serializable {

private static final long serialVersionUID = 7375796948388333325L;

@JsonProperty(value = "menu")
private String name;

@JsonProperty(value = "optionsList")
private List<Map<String, ?>> optionsList;

//Getters and Setters.

通过以下方法我得到 JSON(我正在使用 MongoRepository),第一个 FOR 我得到所有信息,第二个我得到内部映射,但我不知道如何迭代信息在 options 中找到,如果有人能帮我解决这个问题,我将不胜感激:

@GetMapping("/final")
public String obtener() {

List<GetAllRules> allRules = iGetMenuService.getAll(); // Mongo List

String key= "options";

for (GetAllRules rules : allRules) {
    for (Map<String, ?> internal : rules.getOptionsList()) {
        System.out.println(internal.get(key));
        }

    }

return "finalizado";
}

通过 System.out.println(internal.get(key)); 行我得到了我需要的键值但现在我不知道如何通过它对每个数据做一些特定的事情。

[0001, 0022, 0014, 0041, 0042, 0043]
[0238]
[1001, 1003]
[0108, 0109, 0102]
[0601, 0602, 0604, 0604]
[0603, 0901, 0901]
[0238]
[0001]

谢谢。

【问题讨论】:

  • "...但现在我不知道如何逐个处理每个数据的特定内容。" 请告诉你想要什么处理每个数据?
  • 你好 prasad_,我的想法是,对于我检索的每个值,我都会转到 JSON 中的一个列表并检索一些信息以创建另一个对象并返回它,这就像穿越该值的两个 JSON,并使用我需要的信息构建第三个对象。

标签: java spring mongodb loops dictionary


【解决方案1】:

如何迭代options

中的信息

您的 options 字段只是另一个字符串数组/列表,因此您可以在 pojo 中指定:

@JsonProperty(value = "optionsList")
private List<Map<String, List<String>>> optionsList;

这样,您可以再添加一个迭代

        for (GetAllRules rules : allRules) {
            for (Map<String, List<String>> internal : rules.getOptionsList()) {
                for (String value : internal.get(key)) {
                    System.out.println(value);
                    // will print "0001", ...
                }
            }
        }

更好的处理方法是使用 Java 流——你不想使用太多的嵌套循环, 它可能看起来像这样:

        allRules.stream()
                .map(GetAllRules::getOptionsList)
                .flatMap(Collection::stream)
                .flatMap(option -> option.get(key).stream())
                .forEach(System.out::println);

【讨论】:

  • mehowthe,非常感谢你的回答,它帮助我理解了这个问题,你能告诉我用 Java Stream 会怎么样。
  • 不客气,答案附示例
  • mehowthe,我尝试应用 lambda 流,但 optionList 告诉我它没有任何 getOptionsList(),我知道使用表达式删除了 FOR 循环并且嵌套循环的复杂性是避免
  • 对不起 - 我在这个例子中使用了稍微不同的对象结构,现在它已经根据你的对象进行了调整(我希望如此)
猜你喜欢
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2021-11-12
  • 1970-01-01
  • 2011-10-02
  • 2015-01-07
相关资源
最近更新 更多