2017-08-30 75 views
1
[ 
 {"productStatus": 
    [ 
     {"status": "spoilt"}, 
     {"status": "used"} 
    ], 
 "productMsg": 
    [ 
    {"msg": "Valid"} 
    ] 
 }, 
 {"productStatus": 
    [ 
     {"status": "new"}, 
    ], 
 "productMsg": 
    [ 
    {"msg": "Ok"}, 
    {"customMsg" : "blah blah"} 
    ] 
 } 
] 

我将上述数据存储在List<Map<String, List<Map<String, String>>>>;在使用Java流的复杂数据结构中搜索

例如:

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

地图对于每一个productStatus它有新的状态,把它添加到列表中。基本上我将需要返回一个List<Map<String, String>>

我知道如何在传统的Java for循环方法中这样做,我觉得这太笨拙和冗长。有没有一种简洁的方式来使用Streams来做到这一点?

+0

'val' ...这是不是Java? – GhostCat

+0

@GhostCat如上所述,我正在使用Lombok for val。你应该检查一下。可以使编程更快! – user1692342

+4

你为什么不使用POJO模型? – shmosel

回答

2

未经检验的,但我认为这会做你想要什么:

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

哇!这看起来非常整齐和短:o – user1692342