Фильтровать свойства pojo по некоторому шаблону - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть некоторый ответ сервера (длинный), который я преобразовал в POJO (используя библиотеку moshi).

В конце концов, у меня есть список «Предметов», каждый «Предмет» выглядит следующим образом:

public class Item
{
    private String aa;
    private String b;
    private String abc;
    private String ad;
    private String dd;
    private String qw;
    private String arew;
    private String tt;
    private String asd;
    private String aut;
    private String id;
    ...
}

Что мне действительно нужно, это получить все свойства, которые начинаются с «а», а затем мне нужно использовать их значения для дальнейшего запроса ...

Есть ли способ достичь этого без отражения? (возможно использование потоков?)

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Звучит так, как будто вы хотите выполнить фильтрацию на обычной структуре Java-карты.

// Dependencies.
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<Map<String, String>> itemAdapter =
    moshi.adapter(Types.newParameterizedType(Map.class, String.class, String.class));
String json = "{\"aa\":\"value1\",\"b\":\"value2\",\"abc\":\"value3\"}";

// Usage.
Map<String, String> value = itemAdapter.fromJson(json);
Map<String, String> filtered = value.entrySet().stream().filter(
    stringStringEntry -> stringStringEntry.getKey().charAt(0) == 'a')
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Вы можете заключить логику фильтрации в пользовательский JsonAdapter, но проверку и бизнес-логику, как правило, приятно оставить на уровне использования приложения.

0 голосов
/ 27 апреля 2018

С преобразованием функций гуавы вы можете трансформировать свои предметы следующим образом:

 public static void main(String[] args) {
        List<Item> items //
        Function<Item, Map<String, Object>> transformer = new Function<Item, Map<String, Object>>() {
            @Override
            public  Map<String, Object> apply(Item input) {
                  Map<String, Object> result  = new HashMap<String, Object>();
            for (Field f : input.getClass().getDeclaredFields()) {
                if(! f.getName().startsWith("a")) {
                    continue;
                }
                Object value = null;
                try {
                    value = f.get(input);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("failed to cast" + e)
                }
                result.put(f.getName(), value);
               }

            return result
        };
        Collection<Map<String, Object> result
                = Collections2.transform(items, transformer);
    }
...