import org.springframework.cglib.beans.BeanCopier;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
public final class CopierUtil {
private CopierUtil() {
throw new IllegalStateException("Utility class");
}
/**
* 单个对象属性拷贝
* @param source 源对象
* @param clazz 目标对象Class
* @param <T> 目标对象类型
* @param <M> 源对象类型
* @return 目标对象
*/
public static <T, M> T mapTo(M source, Class<T> clazz) {
if (Objects.isNull(source) || Objects.isNull(clazz))
throw new IllegalArgumentException();
return mapTo(source, clazz, null);
}
/**
* 列表对象拷贝
* @param sources 源列表
* @param clazz 源列表对象Class
* @param <T> 目标列表对象类型
* @param <M> 源列表对象类型
* @return 目标列表
*/
public static <T, M> List<T> mapTo(List<M> sources, Class<T> clazz) {
if (Objects.isNull(sources) || Objects.isNull(clazz) || sources.isEmpty())
throw new IllegalArgumentException();
BeanCopier copier = BeanCopier.create(sources.get(0).getClass(), clazz, false);
return Optional.of(sources)
.orElse(new ArrayList<>())
.stream().map(m -> mapTo(m, clazz, copier))
.collect(Collectors.toList());
}
/**
* 单个对象属性拷贝
* @param source 源对象
* @param clazz 目标对象Class
* @param copier copier
* @param <T> 目标对象类型
* @param <M> 源对象类型
* @return 目标对象
*/
private static <T, M> T mapTo(M source, Class<T> clazz, BeanCopier copier) {
if (null == copier){
copier = BeanCopier.create(source.getClass(), clazz, false);
}
T t = null;
try {
t = clazz.newInstance();
copier.copy(source, t, null);
} catch (InstantiationException | IllegalAccessException e) {
// TODO log
}
return t;
}
}