java中类的相互转换

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

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;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值