Без «динамики» прямолинейная вещь может выглядеть так:
List<Map<String, String>> x = listA
.stream()
.map(this::toMap)
.collect(Collectors.toList());
с локальным помощником, таким как:
private Map<String, String> toMap(DTA dta) {
Map<String, String> rv = new HashMap<>();
rv.put("id", dta.getId());
rv.put("age", dta.getAge());
return rv;
}
Чтобы быть полностью динамическим здесь, вам нужно будет использовать отражение для запроса имен полей. Вы можете найти примеры, как это сделать здесь .
Но я настоятельно рекомендую не сделать это: рефлексия всегда должна быть вашим последним средством. Понятие DTA предполагает, что в любом случае у вас есть данные объекта, поступающие из некоторого «сервиса». Если так, то зачем сначала сериализовать в определенный класс DTA, чтобы затем «сплющить» эту информацию в какую-то общую структуру Map?!
Значение: когда этот сервис предоставляет вам объекты, которые сериализуются как, скажем, JSON или XML ... тогда было бы намного лучше просто использовать библиотеку, такую как gson или jackson, чтобы напрямую десериализовать эти данные в такие общие "плоские" объекты на основе карты. Например, Джексон имеет класс JsonNode . Когда вы десериализуете в такие объекты, вы получаете это отображение имен полей бесплатно! Смотрите здесь больше примеров кода.
Дело в том, что идентификация полей с помощью отражения возможна. Но отражение код всегда утомителен и подвержен ошибкам. Если возможно, избегайте делать это самостоятельно.