2017-08-30 65 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