import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 描述:对象 属性复制
* 背景:基于 springframework BeanUtils 封装
* 适用:支持不同类间 Object、List、Set、MyBatisPlus Page 同类型同名属性复制
*
* @author czy
* @date 2022/02/26 22:24
**/
public class BeanUtil {
/**
* 对象 属性复制
*
* @param source the source bean
* @param clazz class to instantiate
* @param <T>
* @return
*/
public static <T> T copyProperties(Object source, Class<T> clazz) {
if (source == null) {
return null;
}
T result = null;
try {
result = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
BeanUtils.copyProperties(source, result);
return result;
}
/**
* 集合 属性复制
*
* @param sourceList the source list
* @param clazz class to instantiate
* @param <T>
* @return
*/
public static <T> Collection<T> copyProperties(Collection<?> sourceList, Class<T> clazz) {
if (sourceList == null || sourceList.isEmpty()) {
return Collections.emptyList(); // 返回不可变空集合,避免 null
}
if (sourceList instanceof List) {
return copyProperties((List<?>) sourceList, clazz);
} else if (sourceList instanceof Set) {
return copyProperties((Set<?>) sourceList, clazz);
} else {
// 默认按 List 处理,适用于大多数场景
return copyProperties(new ArrayList<>(sourceList), clazz);
}
}
/**
* list集合 属性复制
*
* @param sourceList the source list
* @param clazz class to instantiate
* @param <T>
* @return
*/
public static <T> List<T> copyProperties(List<?> sourceList, Class<T> clazz) {
if (sourceList == null) {
return null;
}
return sourceList.stream().map(item -> copyProperties(item, clazz)).collect(Collectors.toList());
}
/**
* set集合 属性复制
*
* @param sourceSet the source set
* @param clazz class to instantiate
* @param <T>
* @return
*/
public static <T> Set<T> copyProperties(Set<?> sourceSet, Class<T> clazz) {
if (sourceSet == null) {
return null;
}
return sourceSet.stream().map(item -> copyProperties(item, clazz)).collect(Collectors.toSet());
}
/**
* MyBatis-Plus page属性复制
*
* @param sourcePage the source page
* @param clazz class to instantiate
* @return
*/
public static <T> Page<T> copyProperties(Page<?> sourcePage, Class<T> clazz) {
if (sourcePage == null) {
return null;
}
Page<T> result = copyProperties((Object) sourcePage, Page.class);
result.setRecords(copyProperties(sourcePage.getRecords(), clazz));
return result;
}
}
轻量级属性复制工具, 支持 Object、集合、MyBatisPlus Page
于 2022-02-27 10:14:48 首次发布