public static <T, M> List<T> copyList(M sources, Class<T> clazz) { if (Objects.isNull(sources) || Objects.isNull(clazz)) throw new IllegalArgumentException(); BeanCopier copier = BeanCopier.create(sources.getClass(), clazz, false); return Optional.of(sources) .orElse(new ArrayList<>()) .stream().map(m -> copyProperties(m, clazz, copier)) .collect(Collectors.toList()); }
时间: 2023-12-27 11:01:56 浏览: 108
这段代码使用了BeanCopier来实现对象之间的属性拷贝,其中copyList方法接收两个参数,sources为源对象,clazz为目标对象的类型,返回值为经过属性拷贝后的目标对象列表。
这里可能存在的问题是,源对象的类型和目标对象的类型并没有做完整的类型校验,有可能会在运行时出现类型转换异常。同时,在使用完BeanCopier后,没有释放对BeanCopier的引用,可能会引起内存泄漏。
可以对代码进行如下修改:
```java
public static <T, M> List<T> copyList(List<M> sources, Class<T> clazz) {
if (Objects.isNull(sources) || Objects.isNull(clazz)) {
throw new IllegalArgumentException();
}
List<T> targets = new ArrayList<>(sources.size());
BeanCopier copier = BeanCopier.create(sources.get(0).getClass(), clazz, false);
for (M source : sources) {
T target;
try {
target = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
copier.copy(source, target, null);
targets.add(target);
}
return targets;
}
```
修改后的代码中,将sources参数的类型修改为List类型,这样就可以通过List的泛型来避免类型转换异常。同时使用了for循环来遍历源对象列表,避免了使用stream时可能存在的空指针异常。还为目标对象列表指定了初始容量,避免了频繁扩容带来的性能问题。在使用完BeanCopier后,还将其置为null,避免了内存泄漏的问题。
阅读全文