3

こんにちは私はコモンズコレクションジェネリック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.)私は何を間違えましたか。ジェネリックスコモンズコレクションのカスタムトランスフォーマーを実装する正しい方法は何ですか。

4

2 に答える 2

6

javadocsは、次のことを明確に述べています。

リストにすでに装飾されている要素がある場合、それらは変換されません。

代わりに次のことを試してください。

CollectionUtils.transform(pricingDtos, PRICING_DTO_TRANSFORMER);

各要素に Transformer を適用してコレクションを変換します。

于 2011-01-17T14:55:31.243 に答える
1

コレクションをその場で変換することは、私にはひどいハックのように思えます。代わりに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 にも同様の仕組みがあるのか​​もしれませんが、一見しただけではわかりませんでした。

于 2011-01-17T15:21:54.943 に答える