2

В commons-collections 3.2.1 следующих один вкладыш работал хорошо для получения myProperty значения объектов внутри myCollection:BeanToPropertyValueTransformer и Обще-collections4

Collection<MyType> myTypes = (Collection<MyType>) CollectionUtils.collect(myCollection, new BeanToPropertyValueTransformer("myProperty")) 

Единственным недостатком является то, что дженерики не поддерживается, поэтому тип литья должен быть сделанный.

Что было бы решением, которое работает в commons-collection4, пользуясь дженериками?

ответ

1

По-видимому, они удалили BeanToPropertyValueTransformer с момента выпуска apache-commons-collection4.

Мне удалось добиться такого же поведения, определив обычай Transformer. Введение генериков исключает необходимость литья сбора выходной:

Collection<MyInputType> myCollection = ... 
Collection<MyType> myTypes = CollectionUtils.collect(myCollection, new Transformer<MyInputType, MyType>() { 
    @Override 
    public MyType transform(MyInputType input) { 
     return input.getMyProperty(); 
    } 
} 

Вы также можете написать свой собственный Transformer, который использует отражение

class ReflectionTransformer<O> 
     implements 
     Transformer<Object, O> { 

    private String reflectionString; 

    public ReflectionTransformer(String reflectionString) { 
     this.reflectionString = reflectionString; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public O transform(
      Object input) { 
     try { 
      return (O) BeanUtils.getProperty(input, reflectionString); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } catch (InvocationTargetException e) { 
      throw new RuntimeException(e); 
     } catch (NoSuchMethodException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

и использовать его так же, как вы привыкли делать с BeanToPropertyValueTransformer

Collection<MyType> myTypes = CollectionUtils.collect(myCollection, new ReflectionTransformer<MyType>("myProperty"));