2017-08-30 13 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); 

私は、すべてのproductMsgsを取得し、productStatusが新しいかどうかを確認する必要があります。例えば一例では私が与えた: 私は新しいステータスを持つすべてproductStatusについて

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

のマップを必要とするだろう、それをリストに追加し続けます。基本的にはList<Map<String, String>>を返す必要があります。

私はこれを従来のJava forループメソッドでどうやってやり遂げることができるかを知っています。これはちょっと面倒すぎると思います。 Streamsを使用してこれを行うためのきちんとした方法はありますか?

+0

'val' ...それは、Javaではありません! – GhostCat

+0

@GhostCat私が言ったように、私は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

うわー!これはもっときれいに見えます。 – user1692342

関連する問題