Вы можете сделать это с помощью обобщений и служебного класса для выполнения работы. Мне это нравится немного лучше, чем при использовании отражения, потому что вы получаете время компиляции, проверяющее, что свойство, которое вы извлекаете, существует (и не содержит орфографических ошибок и т. Д.).
Сначала класс, который выполняет фактическое преобразование. Обратите внимание на абстрактный метод «get», который мы переопределим в анонимном внутреннем классе, когда вызовем getListOfProperties ().
public abstract class ListPropertyGetter<R,T>
{
/** Given a source object, returns some property of type R. */
public abstract R get(T source);
/** Given a list of objects, use the "get" method to retrieve a single property
from every list item and return a List of those property values. */
public final List<R> getListOfProperties(List<T> list)
{
List<R> ret = new ArrayList<R>(list.size());
for(T source : list)
{
ret.add(get(source));
}
return ret;
}
}
Тогда вы используете это так. Не симпатичный лайнер, но время компиляции, проверяющее качество:
List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
// add some PhoneNumbers to the list
List<String> extensions =
new ListPropertyGetter<String, PhoneNumber>()
{
@Override
public String get(PhoneNumber source)
{
return source.getExtension();
}
}.getListOfProperties(phoneNumbers);