2016-08-15 16 views
5

私はいくつかのコレクションList<Map<String, Object>>を必要に応じてJava 8ラムダ式でフィルタリングする必要があります。 フィルタリング基準を適用する必要があるフラグを持つJSONオブジェクトを受け取ります。 JSONオブジェクトが受信されない場合、フィルタリングは必要ありません。そのようなJava 8条件付きフィルタリングとカスタムマップの収集

protected List<Map<String, Object>> populate(List<SomeObject> someObjects, String string) { 
    taskList.stream() 
      // How to put condition here? Ho to skip filter if no filter oprions are received? 
      .filter(someObject -> (if(string != null) someobject.getName == string)) 
      // The second problem is to collect custom map like 
      .collect(Collectors.toMap("customField1"), someObject.getName()) ... // I need somehow put some additional custom fields here 
} 

今、私が集めてるカスタムマップ:

Map<String, Object> someMap = new LinkedHashMap<>(); 
      someMap.put("someCustomField1", someObject.Field1()); 
      someMap.put("someCustomField2", someObject.Field2()); 
      someMap.put("someCustomField3", someObject.Field3()); 

答えて

9

ちょうどチェックしたりせず、その後、使用filterメソッドまたはそれを使用しないでください:

protected List<Map<String, Object>> populate(List<SomeObject> someObjects, String string) { 
    Stream<SomeObject> stream = someObjects.stream(); 
    if (string != null) { 
     stream = stream.filter(s -> string.equals(s.getName())); 
    } 
    return stream.map(someObject -> { 
     Map<String, Object> map = new LinkedHashMap<>(); 
     map.put("someCustomField1", someObject.Field1()); 
     map.put("someCustomField2", someObject.Field2()); 
     map.put("someCustomField3", someObject.Field3()); 
     return map; 
    }).collect(Collectors.toList()); 
} 
4

これを試してください:あなたは、フィルタを適用する必要があるかどうか、

protected List<Map<String, Object>> populate(List<SomeObject> someObjects, String string) { 
    return someObjects.stream() 
      .filter(someObject -> string == null || string.equals(someObject.getName())) 
      .map(someObject -> 
       new HashMap<String, Object>(){{ 
        put("someCustomField1", someObject.Field1()); 
        put("someCustomField2", someObject.Field2()); 
        put("someCustomField3", someObject.Field3()); 
       }}) 
      .collect(Collectors.toList()) ; 
} 
+4

Java 9では、内部クラスの構築をMap.of()で置き換えることができます。 –

+0

@BrianGoetzあなたに会うのはうれしい!私は実際にJavaの同時実行性を読んでいます。 –

+0

@ DavidPrezCabreraまたはjava-9を待ち、guava ImmutableMap.of()を使用しないでください。 – Eugene

関連する問題