2

次のワンライナーでは、 内のオブジェクトcommons-collections 3.2.1の値を取得するのにうまく機能しました:myPropertymyCollection

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

唯一の欠点は、ジェネリックがサポートされていないため、型キャストを行う必要があることです。

commons-collection4ジェネリックを利用して、で機能するソリューションは何でしょうか?

4

2 に答える 2

1

BeanToPropertyValueTransformerのリリースから削除されたようですapache-commons-collection4

custom を定義することで、同じ動作を実現することができました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"));
于 2016-04-04T12:29:38.807 に答える