您的当前位置:首页正文

java中类的相互转换

2024-11-29 来源:个人技术集锦

在日常开发中经常会遇到类的相互转换,下面给大家提供一个工具类:

public class VOHelper {

    private static final Logger log = LoggerFactory.getLogger(VOHelper.class);

    private VOHelper() {
        // Add a private constructor to hide the implicit public one
    }

    public static <T, E> T getVO(Class<T> t, E e) {
        if (e == null) {
            return null;
        }
        try {
            T temp = t.newInstance();
            // 拷贝同名同类型属性
            BeanUtils.copyProperties(e, temp);
            return temp;
        } catch (InstantiationException | IllegalAccessException e1) {
            final StringWriter sw = new StringWriter();
            final PrintWriter pw = new PrintWriter(sw, true);
            e1.printStackTrace(pw);
            log.error(sw.getBuffer().toString());
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    public static <T, E> List<T> getVOList(Class<T> t, List<E> list) {
        if (CollectionUtils.isEmpty(list)) {
            return new ArrayList<>();
        }
        List<T> vos;
        if (list instanceof Page) {
            vos = (List<T>) getVO(Page.class, list);
        } else {
            vos = new ArrayList<>(list.size());
        }

        if (vos != null) {
            for (E e : list) {
                vos.add(getVO(t, e));
            }
        }
        return vos;
    }

    @SuppressWarnings("unchecked")
    public static <T, E> List<T> getVOList(List<E> list, Function<E, T> function) {
        if (list == null || list.isEmpty()) {
            return new ArrayList<>();
        }
        List<T> vos;
        if (list instanceof Page) {
            vos = (List<T>) getVO(Page.class, list);
        } else {
            vos = new ArrayList<>(list.size());
        }

        if (vos != null) {
            for (E e : list) {
                vos.add(function.apply(e));
            }
        }

        return vos;
    }

    @SuppressWarnings("unchecked")
    public static <T, E>
    Collector<T, ?, Page<T>> toPage(List<E> list) {
        return new CollectorPageImpl<>(
                () -> (Page<T>) VOHelper.getVO(Page.class, list),
                List::add,
                (left, right) -> {
                    left.addAll(right);
                    return left;
                },
                Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)));
    }

    private static class CollectorPageImpl<T, A, R> implements Collector<T, A, R> {

        private final Supplier<A> supplier;
        private final BiConsumer<A, T> accumulator;
        private final BinaryOperator<A> combiner;
        private final Function<A, R> finisher;
        private final Set<Characteristics> characteristics;

        CollectorPageImpl(Supplier<A> supplier,
                          BiConsumer<A, T> accumulator,
                          BinaryOperator<A> combiner,
                          Set<Characteristics> characteristics) {
            this.supplier = supplier;
            this.accumulator = accumulator;
            this.combiner = combiner;
            this.finisher = castingIdentity();
            this.characteristics = characteristics;
        }

        @Override
        public BiConsumer<A, T> accumulator() {
            return accumulator;
        }

        @Override
        public Supplier<A> supplier() {
            return supplier;
        }

        @Override
        public BinaryOperator<A> combiner() {
            return combiner;
        }

        @Override
        public Function<A, R> finisher() {
            return finisher;
        }

        @Override
        public Set<Characteristics> characteristics() {
            return characteristics;
        }

        @SuppressWarnings("unchecked")
        private static <I, R> Function<I, R> castingIdentity() {
            return i -> (R) i;
        }
    }
显示全文