
比如这段代码: 从Goods这个大对象( 20+字段,对应 DB 中 Goods 表)列表里截取( 5 个字段)生成小对象列表( GoodsApiVo )进行返回, 工程里到处都有这样的样板代码。
假设以后小对象需要获取 10 个字段, 那岂不是,map 那一行写很长很长?
希望有什么简单的方法进行重构。
// List<Goods> goods ==> List<GoodsApiVo> goodsApiVos List<GoodsApiVo> goodsApiVos = goods.stream() .map((Goods s) -> new GoodsApiVo(s.getBarcode(), s.getName(), s.getPrice(), s.getCreateTime(), s.getUpdateTime())) .collect(Collectors.toList()); 1 eltria Sep 22, 2021 大对象小对象字段同名的话,cglib beancopier 就行了,而且对性能的影响是最小化的 |
2 aichunya Sep 22, 2021 BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties); 这个,可以把不需要的字段 ignore? |
3 chendy Sep 22, 2021 使用 mapstruct 这类的工具做转换,节省一部分代码量 另外除非涉及到数据安全或者性能之类的问题,返回所有字段也不是什么坏事。。。 |
4 dqzcwxb Sep 22, 2021 手动 set 性能最高且方便维护,改成链式 set 即可 |
5 wolfie Sep 22, 2021 mapstruct + 1 |
6 EscYezi Sep 22, 2021 via iPhone mapstruct+1 |
7 Leviathann Sep 22, 2021 感觉没什么问题,或者你写个静态方法放到 dto 的 class 里 这部分逻辑本来就是不能少的,换别的方法也只是藏起来,如果有问题更不好找 |
8 youngxhui Sep 22, 2021 Spring 的 Beauntils 可以方便的实现两个对象之间的属性拷贝 |
9 cubecube Sep 22, 2021 挨个 set 也不费劲。 还没有黑盒子,bean copy 慢不说,copy 深度还得自己去研究下啥的,没啥太大收益。 |
10 aragakiyuii Sep 22, 2021 new GoodsApiVo(Goods s) 这种比上面那个好点吧,改的话就直接去改构造函数里的东西就行了 |
11 HiShan Sep 22, 2021 实现一个方法:public GoodApiVo toGoodApiVo(String... fields) List<GoodsApiVo> goodsApiVos = goods.stream().map((Good::toGoodApiVo).collect(Collectors.toList()); |
12 wowo243 Sep 22, 2021 beanUtils 或者 json 序列化再反序列化一下实现拷贝 |
13 siweipancc Sep 22, 2021 via iPhone hutool 工具有个 toBean 方法,最快最简单的方法了 |
14 passerbytiny Sep 22, 2021 via Android 并不是所有类似代码都能提取成公共处理。从 A 表中提取 5 个字段生成 A2 对象、从 B 表中提取 5 个字段生成 B2 对象,这两个操作 |
15 passerbytiny Sep 22, 2021 via Android 就像张三、李四吃饭一样,看起来是类似的但却是实在在是两码事。 绝对的不复制粘贴代码,是过度模式,楼主贴的代码就是最合适的 2 处理方式。 |
16 AoEiuV020 Sep 22, 2021 条件允许的话考虑继承,或者用接口, 比如 Goods implements GoodsApiVo, |
17 INTOX8O Sep 30, 2021 Jackson 的 ObjectMapper.convertValue() 字段名一样可以直接转换,不一样可以配置模糊匹配或者自定义 Jsonserializer |