Java: Обобщения Commons-Collections: Как заставить работать собственный преобразователь - PullRequest
3 голосов
/ 17 января 2011

Привет, я использую общие коллекции 4.01.

У меня есть объект dto.

Class PricingDto {
   private Double tax;
   private Double price;
   private Double tip;

   // getters and setters
}

у меня есть список List<PricingDto> pricingDtos = this.pricingService.getAllPricings();

чем у меня есть частный статический класс.

import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.list.TransformedList;

class TotalServiceImpl implements TotalService {
    public static final PricingDtoTransformer PRICING_DTO_TRANSFORMER =
        new PricingDtoTransformer();
    private static class PricingDtoTransformer
        implements Transformer<PricingDto, Double> {
        public PricingDtoTransformer() {}

        @Override
        public Double transform(final PricingDto pricingDto) {
            return pricingDto.getTax()
                     + pricingDto.getPrice()
                     + pricingDto.getTips();
        }
    }

    @Override
    public List<Double> getListDouble(final List<PricingDto> pricingDtos) {
        final List<Double> totalList = 
            TransformedList.decorate(pricingDtos, PRICING_DTO_TRANSFORMER);
            for (Double d : totalList) {
                // print them. 
            }
        }
    }
}

Моя проблема в том, что я получаю исключение приведения класса, потому что каждый элемент в totalList является PricingDto, а не Double.

2.) Что я сделал не так. Как правильно реализовать собственный преобразователь для обобщенных коллекций.

Ответы [ 2 ]

6 голосов
/ 17 января 2011

В javadocs четко указано, что:

Если какие-либо элементы уже есть в список украшен, они НЕ трансформируются.

Попробуйте вместо этого:

CollectionUtils.transform(pricingDtos, PRICING_DTO_TRANSFORMER);

, который преобразует коллекцию, применяя Transformer к каждому элементу.

1 голос
/ 17 января 2011

Преобразование коллекций на месте кажется мне ужасным хаком.Я бы предложил вместо этого использовать Google Guava .Это Lists.transform(List,Function) возвращает представление, которое поддерживается исходным списком и функцией отображения, поэтому вы ничего не меняете.

Вот как будет выглядеть ваш код:

class TotalServiceImpl implements TotalService{

    private static final Function<PricingDto, Double> PRICING_DTO_TRANSFORMER =
        new PricingDtoTransformer();

    private static class PricingDtoTransformer implements
        Function<PricingDto, Double>{

        public PricingDtoTransformer(){
        }

        @Override
        public Double apply(final PricingDto pricingDto){
            return pricingDto.getTax() + pricingDto.getPrice()
                + pricingDto.getTips();
        }
    }

    public List<Double> getListDouble(final List<PricingDto> pricingDtos){
        final List<Double> totalList =
            Lists.transform(pricingDtos, PRICING_DTO_TRANSFORMER);
        for(final Double d : totalList){
            // print them.
        }
        return totalList;
    }

}

У Commons-Collections также может быть похожий механизм, но я не смог найти его на первый взгляд.

...