2016-08-15 2 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

@ DavidPérezCabrera или не дождаться java-9 и использовать guava ImmutableMap.of() – Eugene

Смежные вопросы