English 中文(简体)
Java: Commons-Collections generics: How to get custom transformer to work
原标题:

Hi i am using commons collections generics 4.01.

I have a dto object.

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

   // getters and setters
}

i have a list of List<PricingDto> pricingDtos = this.pricingService.getAllPricings();

than i have a private static class.

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. 
            }
        }
    }
}

My problem is i get class cast exception, because each item in totalList is a PricingDto and not Double.

2.) What did i do wrong. Whats the correct way to implement custom transformer for generics commons-collections.

最佳回答

Transforming the collections in place seems like an awful hack to me. I d suggest using Google Guava instead. It s Lists.transform(List,Function) returns a view that is backed by the original List and a mapping function, so you re not actually changing anything.

Here s what your code would look like:

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 might also have a similar mechanism, but I couldn t find it at first glance.

问题回答

The javadocs clearly state that:

If there are any elements already in the list being decorated, they are NOT transformed.

Try the following instead:

CollectionUtils.transform(pricingDtos, PRICING_DTO_TRANSFORMER);

which will transform the collection by applying the Transformer to each element.





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签