java - 使用 Java Streams 在复杂数据结构中搜索

标签 java java-8

[
 {"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。例如在我给出的例子中: 我需要

的 map
{"msg": "Ok"},
{"customMsg" : "blah blah"}

对于每个具有新状态的产品状态,请继续将其添加到列表中。基本上我需要返回 List<Map<String, String>>

我知道如何使用传统的 Java for 循环方法来完成此操作,但我觉得这种方法太笨拙且冗长。有没有一种巧妙的方法可以使用 Streams 来做到这一点?

最佳答案

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

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

关于java - 使用 Java Streams 在复杂数据结构中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45953364/

相关文章:

java - OnTouch MotionEvent Action 移动未触发

java - 是否有必要用 Dagger 2 注入(inject)一切?

java - JUnit 如何处理预期的失败?

java - 将方法作为参数传递并在 forEach 循环中使用

java 8,使用相同的 javassist 时,Lambda 表达式的工作方式不同

java - 将 'Web, 28 Aug 2014 15:47' 格式的日期转换为正确的格式

java - 使用 java 8 将逗号分隔的字符串列表映射到列表映射

java - 列表 foreach 方法

java - 如何为方法返回的流启用 "type information"?

java - spring 集成中的自定义并发 TcpOutboundGateway