不管是经典的MVC框架还算是现在火热的DDD领域驱动设计,为了业务之间的结构分离,都生成了各种对象,比如VO,DTO,POJO等十分常见,还有Domain,Value,Entity等领域对象也是频繁出现,随之而来的也是各个对象之间的转换,于是,各家拷贝工具也是百家齐放,争奇斗艳,我试着写了一个,斗胆发出来献献丑
工具类主要的功能主要分为两个功能
相同属性之间的复制 使用Spring的 BeanCopier
进行复制,相对于其他复制工具类, BeanCopier
的效率相对较高,且简单易用,不用再加入第三方Jar(如果你觉得Spring也是第三方,我没有意见)
其他属性的赋值,使用 Java8
新工具类 BiConsumer
, BiConsumer
可以对出口对象进特异化赋值,比如字典的Value换成Name,增加子集对象(典型的订单下的商品),还可以有其他特殊的操作会在例子中演示
public static <S, T> T convertOne(Class<S> source, Class<T> target, S view, BiConsumer<S, T> consumer) { BeanCopier copier = BeanCopier.create(source, target, false); return copyOne(view, target, consumer, copier); } 复制代码
public static <S, T> List<T> convertList(Class<S> source, Class<T> target, List<S> list, BiConsumer<S, T> consumer) { BeanCopier copier = BeanCopier.create(source, target, false); return list.stream() .map(copyMapper(target, consumer, copier)) .filter(Objects::nonNull) .collect(Collectors.toList()); } 复制代码
//Set //Map 其实代码逻辑相当的简单,所以扩展也非常简单容易,如果有其他需求可以方便的进行任意的扩展 复制代码
private static <S, T> Function<S, T> copyMapper(Class<T>target,BiConsumer<S, T> consumer, BeanCopier copier) { return source -> copyOne(source, target, consumer, copier); } private static <S, T> T copyOne(S source, Class<T> target, BiConsumer<S,T> consumer, BeanCopier copier) { try { T t = target.newInstance(); copier.copy(source, t, null); //todo consumer可以传空,即只做复制,不做特异化操作 if (consumer != null) { consumer.accept(source, t); } return t; } catch (Exception e) { //todo 请自行处理异常逻辑,这边简单返回null return null; } } 复制代码
List<Order> orders = new ArrayList<>(); convertList(Order.class, OrderVo.class, orders, (s, t) -> { //设置其他属性 t.setGoods(goods); //特殊属性转化 t.setOrderTimeString(s.getOrderTime().toString()); }); 复制代码
相对于其他的深拷贝工具,本工具的优点就是简单快捷,无第三方工具类,使用简单,而不是需要增加依赖,同时功能也相对强大,将特殊字段的处理逻辑交由外部传入,可以让调用方做到完全自主化的特异化赋值,最后,希望能够帮助到你