【问题标题】:Searching in a Complex Data structure using Java Streams使用 Java 流在复杂数据结构中搜索
【发布时间】:2017-08-30 06:26:02
【问题描述】:
[
 {"productStatus":
    [
     {"status": "spoilt"},
     {"status": "used"}
    ],
 "productMsg":
    [
    {"msg": "Valid"}
    ]
 },
 {"productStatus":
    [
     {"status": "new"},
    ],
 "productMsg":
    [
    {"msg": "Ok"},
    {"customMsg" : "blah blah"}
    ]
 }
]

我将上述数据存储在List<Map<String, List<Map<String, String>>>>

例如:

val is represented by Lombok library.
val firstObj = ImmutableList.of(ImmutableMap.of("status", "spoilt"),
                ImmutableMap.of("status", "new"),
                ImmutableMap.of("status", "used"));
val secondObj = ImmutableList.of(ImmutableMap.of("msg", "Valid"));
val productStatus1 = ImmutableMap.of("productStatus", firstObj,
                "productMsg", secondObj);

val firstObj_1 = ImmutableList.of(ImmutableMap.of("status", "new"));
val secondObj_2 = ImmutableList.of(ImmutableMap.of("msg", "Ok"));
val productStatus_2 = ImmutableMap.of("productStatus", firstObj_1,
                "productMsg", secondObj_2);

val testObj = ImmutableList.of(productStatus1, productStatus_2);

我需要确定一个 productStatus 是否是新的,然后获取所有 productMsgs。例如在我给出的示例中: 我将需要

的地图
{"msg": "Ok"},
{"customMsg" : "blah blah"}

对于每个状态为 new 的 productStatus,继续将其添加到列表中。基本上我需要返回一个List<Map<String, String>>

我知道如何在传统的 Java for 循环方法中执行此操作,我觉得这太笨拙和冗长。有没有使用 Streams 的巧妙方法?

【问题讨论】:

  • val ...这不是java?!
  • 你为什么不用 POJO 模型?
  • 您应该为您的数据创建类,而不是将所有内容存储为字符串映射列表。它会让您(和我们)的生活更轻松。
  • 您是否建议我先解析数据并将其存储在一个类中,然后进行任何我需要的搜索?
  • 我想这取决于你如何使用数据以及它会保留多长时间,但这绝对值得考虑。

标签: java java-8


【解决方案1】:

未经测试,但我认为这会满足您的要求:

List<Map<String, String>> msgs = testObj.stream()
        .filter(obj -> obj.get("productStatus").stream()
                .anyMatch(s -> s.get("status").equals("new")))
        .flatMap(obj -> obj.get("productMsg").stream())
        .collect(Collectors.toList());

【讨论】:

  • 哇!这看起来更整洁更短:o
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
相关资源
最近更新 更多