在日常开发中经常会遇到类的相互转换,下面给大家提供一个工具类:
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;
}
}